如何在 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…
我正在努力为管理中的一个成员摘要字段添加排序功能。
我已经扩展了 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…