我正在使用modeladmin来显示一些事件DataObjects。
我在摘要字段中添加了许多列,客户希望能够对其进行排序。目前,默认情况下只有标题可以排序。是否可以在modeladmin中修改gridfieldconfig?特别是要向GridFieldSortableHeader添加字段?
这是我的事件数据对象,其中包含我需要能够在modeladmin中排序的摘要字段:
......
static $summary_fields = array('Title', 'DescriptionSummary', 'EventStartDate', 'EventEndDate', 'EventVenue');
static $field_labels = array('DescriptionSummary' => 'Description', 'EventStartDate' => 'Start Date', 'EventEndDate' => 'End Date', 'EventVenue' => 'Venue');
private $widget;
//TO GET THE SUMMARY FIELD VALUES
public function getEventVenue(){
if ($eventVenue = $this->Venue()->Title) return $eventVenue;
return "No Venue specified";
}
public function getEventStartDate(){
if ($startDate = DataObject::get_one('CalendarDateTime', 'EventID = '.$this->ID)) return $startDate->StartDate;
return "No start dates specified";
}
public function getEventEndDate(){
if ($startDate = DataObject::get_one('CalendarDateTime', 'EventID = '.$this->ID)) return $startDate->EndDate;
return "No end dates specified";
}
....
和我的活动管理员:
class EventAdmin extends ModelAdmin {
public static $managed_models = array('CalendarEvent', 'Venue', 'EventCategory');
static $url_segment = 'events';
static $menu_title = 'Events';
}
答案 0 :(得分:10)
我刚刚向doc.silverstripe.org添加了一些信息,介绍如何覆盖编辑表单并访问(link)中的GridField。相关位(适合您的用例):
class EventAdmin extends ModelAdmin {
// ...
public function getEditForm($id = null, $fields = null) {
$form = parent::getEditForm($id, $fields);
$gridField = $form->Fields()->fieldByName($this->sanitiseClassName($this->modelClass));
$gridField->getConfig()->getComponentByType('GridFieldSortableHeader')
->setFieldSorting(array(...));
return $form;
}
}
如果您尝试按CalendarDate
关系和EventStartDate
字段进行排序,则通常必须覆盖ModelAdmin中的结果列表,请参阅docs。
虽然您可以在那里添加必要的联接(DataQuery->leftJoin
),但这是不可能的
在查询中选择其他列。这样只会让你排序
默认情况下为EventStartDate
,但不是通过UI重新排序GridField。
它是一个缺失的功能,我们应该真正支持DataList->sort()
开箱即用的“点符号”。