2017-10-13 31 views
1

我很努力在管理員的一個成員彙總字段中添加排序功能。如何在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擴展但不是核心成員列表的答案。謝謝!

回答

3

首先,我不確定爲什麼你選擇了一個名爲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來格式化它。它完美地工作,歡呼。 –

相關問題