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




Классы 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-адрес, но с разными параметрами:
В методе 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')
;
}
Надеюсь, это кому-то поможет. Я искал более элегантные способы, например настройку в административной службе, но не мог найти лучшего решения. Если у кого-то есть другие предложения, буду рад узнать что-то новое.
@devilcius Я не думал об этом крайнем случае. Спасибо, что указали. Для меня это действительно сработало. Я думаю, что идеальным решением было бы установить опцию в админке, но я не знаю, как это сделать. Любая возня с методом configureListFields - грязный подход.
@devilcius Проблема с вашим решением будет заключаться в том, что мозаичный вид будет отображаться, даже если пользователь нажимает кнопку списка. Это было бы неприятно. Условие if должно быть расширено с помощью вашего фрагмента, чтобы уловить упомянутый вами крайний случай. Тем не менее, это все еще быстрое и грязное решение, и я знаю об этом, но из-за отсутствия более глубокого понимания и лучших знаний я должен пока придерживаться его.
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');
}
Это решение не сработает, если нет запроса, например, в результате глобального поиска. Я бы посоветовал просто сделать: if ($ this-> hasRequest ()) {$ this-> setListMode ('mosaic'); }