2017-10-13 5 views
1

adminのメンバーサマリーフィールドの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; 
} 

を...私のクラスには、私はこれらも私は何も変わらないこの2つの関数からnullを返すようにしても、呼び出されている確信していません。

私は、ModelAdminの拡張機能を扱ういくつかの答えを見つけましたが、コアのメンバーリストのものは見つかりませんでした。ありがとう!

答えて

3

まず、OrganisationNameという名前のゲッターを選んだ理由はわかりません。Organisationを直接使うことができますか?つまり、あなたの質問は有効で、さまざまなシナリオやフィールドタイプに当てはまると思います。

メンバーの編集に使用されているフォームフィールドはMembers GridFieldで、SecurityAdminです。幸いにも、SecurityAdminのフォームフィールドを変更するための拡張フック(updateEditForm)があります。 、メンバー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に設定を経由して拡張を適用します。

dev/buildあなたの後
# Within _config/config.yml 
SecurityAdmin: 
    extensions: 
    - MemberAdminExtension 

メンバーテーブルはOrganisation Nameでソート可能である必要があります。

+0

OrganisationNameという名前の「ゲッター」がprobレム。なぜ私はそれをしたのか分かりませんが、あなたのコメントのために私はそれを削除し、組織をソート可能にする私の試みをすべてコメントしました - そして、Silverstripeはそれをデフォルトでソート可能にしました! 私は答えをテストしましたが、それをフォーマットするためにゲッターを必要とする別のカスタムフィールド用に実装しました。そして、それは完璧に働いた、歓声。 –

関連する問題