Как добавить сортируемый столбец для списка участников в админке Silverstripe?

Я изо всех сил пытаюсь добавить функцию сортировки в одно из полей сводки моих участников в админке.

Я расширил класс члена Silverstripe, используя:

class MyMemberExtension extends DataExtension

Я добавил несколько полей в сетку по умолчанию в админке:

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, но не основного списка участников. Спасибо!


person old_bluffer    schedule 13.10.2017    source источник


Ответы (1)


Прежде всего, я не уверен, почему вы выбрали геттер с именем 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'
                ]);
            }
        }
    }
}

И примените расширение через config к SecurityAdmin:

# Within _config/config.yml
SecurityAdmin:
  extensions:
    - MemberAdminExtension

После dev/build ваша таблица участников также должна быть отсортирована по Organisation Name

person bummzack    schedule 14.10.2017
comment
Проблема с получателем с именем OrganisationName. Я не уверен, почему я это сделал, но из-за вашего комментария я удалил его, закомментировал все мои попытки настроить организацию для сортировки - и Silverstripe сделал ее сортированной по умолчанию! Я тоже проверил ваш ответ, реализовав его для другого настраиваемого поля, для которого требовалось отформатировать получатель. И это сработало отлично, ура. - person old_bluffer; 18.10.2017