如何在Silverstripe admin中为成员列表添加可排序列?

时间:2017-10-13 17:14:58

标签: php silverstripe

我正在努力在管理员的一个成员摘要字段中添加排序功能。

我使用以下方法扩展了Silverstripe成员类:

class MyMemberExtension extends DataExtension

我在admin:

中的默认网格字段中添加了几个字段
private static $db = array(
    'Organisation' => 'Varchar(100)'
);

private static $summary_fields = array( 
    'FirstName' => 'First Name', 
    'Surname' => 'Surname', 
    'Email' => 'Email', 
    'OrganisationName' => 'Organisation Name', 
    'LastVisited' => 'Last Visited',
    'NumVisit' => 'Num Visits'
);

private static $casting = array(
    'OrganisationName' => 'Varchar(100)'
);

public function getOrganisationName() {
    return $this->owner->Organisation; 
}

......一切都很好。

但是,只有像LastVisited这样的核心字段会在列标题上给我排序箭头。

我目前担心如何在我的组织字段上实现排序。我尝试添加:

public function getCMSFields()
{
    $fields = parent::getCMSFields();

    $grid = $fields->dataFieldByName('Organisation');
    $gridConfig = $grid->getConfig();
    $gridConfig->addComponent(new GridFieldSortableHeader());
    return $fields;
}    

public function getEditForm($id = null, $fields = null) {
    $form=parent::getEditForm($id, $fields);

    $model = singleton($this->modelClass);

    // add sorting if we have a field for... 
    if (class_exists('GridFieldSortableRows')
        && $model->hasField('Organisation')
        && $gridField=$form->Fields()->dataFieldByName($this->sanitiseClassName($this->modelClass))) {
        if($gridField instanceof GridField) {
            $gridField->getConfig()->addComponent(new GridFieldSortableRows('Organisation'));
        }
    }
    return $form;
}

...到我的班级,但我不相信这些甚至被调用,因为即使我从这两个函数返回null也没有任何变化。

我找到了一些处理ModelAdmin扩展的答案,但没有针对核心成员列表。谢谢!

1 个答案:

答案 0 :(得分:3)

首先,我不确定为什么你选择了一个名为 renderRows = () => { const myData = require('./data.txt'); papaparse.parse(myData, { download: true, delimiter: '\t', complete: function (results) { console.log(results); const rows = results.data.map((result, index) => ( <tr key={index}> <td>{result}</td> </tr>)) return (rows); } }); } render() { return ( <div> This is table <table> {this.renderRows()} </table> </div> ); } } 的getter,你也可以直接使用OrganisationName?话虽如此,我认为您的问题是有效的,可能适用于不同的场景和/或字段类型。

用于编辑成员的表单字段是Organisation中的Members GridField。幸运的是,有一个扩展挂钩(SecurityAdmin)来修改updateEditForm的表单字段。

因此,为了修改成员GridField的排序,请创建如下所示的扩展名:

SecurityAdmin

并通过配置将扩展名应用于<?php class MemberAdminExtension extends Extension { public function updateEditForm(Form $form) { /** @var GridField $memberGridField */ if ($memberGridField = $form->Fields()->dataFieldByName('Members')) { /** @var GridFieldSortableHeader $sortHeader */ if ($sortHeader = $memberGridField->getConfig()->getComponentByType('GridFieldSortableHeader')) { // Map OrganisationName to the Organisation field $sortHeader->setFieldSorting([ 'OrganisationName' => 'Organisation' ]); } } } }

SecurityAdmin

# Within _config/config.yml SecurityAdmin: extensions: - MemberAdminExtension 您的会员表也应按dev/build排序......

相关问题