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

问题描述:

我很努力在管理员的一个成员汇总字段中添加排序功能。如何在Silverstripe admin中为成员列表添加可排序列?

我已经延长使用Silverstripe成员类:

class MyMemberExtension extends DataExtension 

我在管理增加了一些字段的默认gridfield:

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扩展但不是核心成员列表的答案。谢谢!

首先,我不确定为什么你选择了一个名为OrganisationName的获取者,你可以直接使用Organisation?话虽如此,我认为你的问题是有效的,可能适用于不同的场景和/或字段类型。

正在用于编辑成员的窗体字段是Members GridField在SecurityAdmin之内。幸运的是,有一个扩展挂钩(updateEditForm)来修改SecurityAdmin的表单域。

所以为了修改会员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后您的会员表应该排序为Organisation Name以及...

+0

将名为OrganisationName的“getter”证明是prob LEM。我不确定我为什么这么做,但是由于你的评论,我删除了它,并且评论了我所有的尝试让组织可以排序的方式 - 而Silverstripe在默认情况下使它可以排序! 我也测试过你的答案,通过实现它为一个不同的自定义字段,它需要一个getter来格式化它。它完美地工作,欢呼。 –