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