2013-09-30 6 views
0

Есть ли способ группировать GridField (например, по ID)? Следующий запрос (many_many) возвращает некоторые объекты данных дважды или более, если они не имеют одинакового SortOrder. Вот какой код. Я надеюсь, что кто-то может помочь ;-)Несколько строк с одинаковым идентификатором в Silverstripe GridField

private static $many_many = array(
    'Mitarbeiter'   => 'Mitarbeiter', 
); 

private static $many_many_extraFields = array(
    'Mitarbeiter' => array(
     'SortOrder' => "Int" 
    ) 
) 

     // Start Mitarbeiterzuordnung 
     $MitarbeiterFieldConfig = GridFieldConfig::create()->addComponents(
      new GridFieldToolbarHeader(), 
      //new GridFieldSortableHeader(), 
      new GridFieldDataColumns(), 
      new GridFieldDeleteAction('unlinkrelation'), 
      new GridFieldSortableRows('SortOrder'), 
      new GridFieldManyRelationHandler(), 'GridFieldPaginator', 
      new GridFieldPaginator(20) 
     ); 
     $MitarbeiterField = new GridField("Mitarbeiter", "Mitarbeiter", $this->Mitarbeiter()->sort('SortOrder'), $MitarbeiterFieldConfig); 
     $fields->addFieldToTab('Root.Mitarbeiter', $MitarbeiterField); 
+0

Вы пытались настроить метод 'Mitarbeiter()', который возвращает '$ this-> getManyManyComponents ('Mitarbeiter') -> sort ('SortOrder')'. Затем в 'new GridField' вы просто используете' $ this-> Mitarbeiter() '. Это, по-видимому, стандартный способ настройки 'GridFieldSortableRows' ... – colymba

+0

да, я положил \t public function Mitarbeiter() { return $ this-> getManyManyComponents ('Mitarbeiter') -> sort ('SortOrder') - ; } после публичной функции getCMSFields() { Но без успеха? } – Carsten

+0

и вы изменили '$ this-> Mitarbeiter() -> sort ('SortOrder')' to '$ this-> Mitarbeiter()' в 'new GridField (..' statement? – colymba

ответ

0

Существует проблема с GridFieldManyRelationHandler.php и имеющий private static $many_many_extraFields как сортировка поля.

Запрос выполняется с сортировкой SortOrder и потому, что он использует разные, те, которые имеют разные значения, рассматриваются как дополнительные, поэтому те, у которых есть набор заказов, отображаются дважды.

Вам нужно создать копию GridFieldManyRelationHandler.php (я назвал его GridFieldManyManyRelationHandler.php) и измените следующую функцию:

public function getManipulatedData(GridField $gridField, SS_List $list) { 
    if(!$list instanceof RelationList) { 
     user_error('GridFieldManyRelationHandler requires the GridField to have a RelationList. Got a ' . get_class($list) . ' instead.', E_USER_WARNING); 
    } 

    $state = $this->getState($gridField); 

    // We don't use setupState() as we need the list 
    if($state->FirstTime) { 
     $state->RelationVal = array_values($list->getIdList()) ?: array(); 
    } 
    if(!$state->ShowingRelation && $this->useToggle) { 
     return $list; 
    } 

    $baseClass = $list->dataClass(); 
    return $baseClass::get(); 


} 

Затем называют этот новый класс от вашего кода, т.е.

private static $many_many = array(
    'Mitarbeiter'   => 'Mitarbeiter', 
); 

private static $many_many_extraFields = array(
    'Mitarbeiter' => array(
     'SortOrder' => "Int" 
    ) 
) 

     // Start Mitarbeiterzuordnung 
     $MitarbeiterFieldConfig = GridFieldConfig::create()->addComponents(
      new GridFieldToolbarHeader(), 
      //new GridFieldSortableHeader(), 
      new GridFieldDataColumns(), 
      new GridFieldDeleteAction('unlinkrelation'), 
      new GridFieldSortableRows('SortOrder'), 
      new GridFieldManyManyRelationHandler(), 'GridFieldPaginator', 
      new GridFieldPaginator(20) 
     ); 
     $MitarbeiterField = new GridField("Mitarbeiter", "Mitarbeiter", $this->Mitarbeiter()->sort('SortOrder'), $MitarbeiterFieldConfig); 
     $fields->addFieldToTab('Root.Mitarbeiter', $MitarbeiterField); 

Это, вероятно, должно быть реорганизовано и два класса должны быть разделены (один класс обрабатывает many_many, а другой has_many).

Смежные вопросы