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

How to add sortable column for member list in Silverstripe admin?

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

我已经扩展了 Silverstripe 成员 class 使用:

class MyMemberExtension extends DataExtension

我在管理员的默认网格字段中添加了几个字段:

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 这样的核心字段在列 headers 上给我排序箭头。

我目前对如何在我的组织字段上实施排序感到困惑。我尝试添加:

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;
}

...到我的 class,但我不相信这些甚至被调用,因为即使我只是从这两个函数中 return null 也没有任何改变。

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

首先,我不确定您为什么选择一个名为 OrganisationName 的 getter,您也可以直接使用 Organisation?话虽这么说,我认为你的问题是有效的,并且可能适用于不同的场景 and/or 字段类型。

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

的表单字段

因此,为了修改 Members GridField 的排序,创建如下扩展:

<?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 之后,您的会员 table 也应该被 Organisation Name 排序 table…