Администратор сонаты: по умолчанию выбрана мозаика

Я использую Sonata Admin, и у меня есть список и мозаичный вид. Как выбрать вид мозаики по умолчанию?
Я не хочу СКРЫТЬ представление списка, просто выберите вид мозаики по умолчанию.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
4
0
423
2

Ответы 2

Классы Admin наследуются от AbstractAdmin. Если у нас есть класс Entity Foo, мы должны создать класс администратора FooAdmin, расширяющий Sonata\AdminBundle\Admin\AbstractAdmin.

Заглянем в исходный код:

public function setListMode($mode)
{
    if (!$this->hasRequest()) {
        throw new \RuntimeException(sprintf('No request attached to the current admin: %s', $this->getCode()));
    }

    $this->getRequest()->getSession()->set(sprintf('%s.list_mode', $this->getCode()), $mode);
}

public function getListMode()
{
    if (!$this->hasRequest()) {
        return 'list';
    }

    return $this->getRequest()->getSession()->get(sprintf('%s.list_mode', $this->getCode()), 'list');
}

Это методы, которые устанавливают и получают режим списка. Есть кнопки для двух режимов списка: list и mosaic. Если вы наведете указатель мыши, вы увидите, что они указывают на один и тот же URL-адрес, но с разными параметрами:

  • / list? _list_mode = список
  • / list? _list_mode = мозаика

В методе getListMode мы видим, что режим list вызывается по умолчанию.

Как я выяснил, установить mosaic по умолчанию - это вызвать метод setListMode в классе Admin:

protected function configureListFields(ListMapper $listMapper)
{
    if ($mode = $this->request->query->get('_list_mode')) {
        $this->setListMode($mode);
    } else {
        $this->setListMode('mosaic');
    }

    $listMapper
        ->addIdentifier('fooId')
        ->add('fooBar')
    ;
}

Надеюсь, это кому-то поможет. Я искал более элегантные способы, например настройку в административной службе, но не мог найти лучшего решения. Если у кого-то есть другие предложения, буду рад узнать что-то новое.

Это решение не сработает, если нет запроса, например, в результате глобального поиска. Я бы посоветовал просто сделать: if ($ this-> hasRequest ()) {$ this-> setListMode ('mosaic'); }

devilcius 27.11.2018 10:00

@devilcius Я не думал об этом крайнем случае. Спасибо, что указали. Для меня это действительно сработало. Я думаю, что идеальным решением было бы установить опцию в админке, но я не знаю, как это сделать. Любая возня с методом configureListFields - грязный подход.

cezar 27.11.2018 10:33

@devilcius Проблема с вашим решением будет заключаться в том, что мозаичный вид будет отображаться, даже если пользователь нажимает кнопку списка. Это было бы неприятно. Условие if должно быть расширено с помощью вашего фрагмента, чтобы уловить упомянутый вами крайний случай. Тем не менее, это все еще быстрое и грязное решение, и я знаю об этом, но из-за отсутствия более глубокого понимания и лучших знаний я должен пока придерживаться его.

cezar 27.11.2018 10:37

In the method getListMode we see that the list mode is called per default.

Так что, на мой взгляд, самый простой способ - переопределить getListMode и заменить «список» на «мозаику».

public function getListMode()
{
    if (!$this->hasRequest()) {
        return 'mosaic';
    }

    return $this->getRequest()->getSession()->get(sprintf('%s.list_mode', $this->getCode()), 'mosaic');
}

Другие вопросы по теме