1

我正在使用 modeladmin 来显示一些事件数据对象。

我在汇总字段中添加了一些列,客户希望能够按照这些列进行排序。目前,默认情况下只有标题是可排序的。是否可以在 modeladmin 中修改 gridfieldconfig?特别是向 GridFieldSortableHeader 添加字段?

这是我的事件数据对象,其中包含我需要能够在模型管理中排序的汇总字段:

......
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';

}
4

1 回答 1

10

我刚刚向 doc.silverstripe.org 添加了一些关于如何覆盖编辑表单和访问(链接)内的 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()开箱即用的“点符号”。

于 2012-11-15T21:30:46.900 回答