Я пытаюсь переопределить шаблон макета в Sonata Admin, но зависит от пользователя, вошедшего в систему. Если зарегистрированный пользователь принадлежит группе клиентов, имеет какую-то роль - показать другой макет.
Я хочу изменить -
layout" => "@SonataAdmin/standard_layout.html.twig"
Где лучше всего это сделать?
Я обнаружил, что могу сделать это в классе администратора - переопределить getTemplate.
Но возможно ли это сделать каким-нибудь слушателем и переключить глобализацию без правки административных классов?
ОБНОВЛЕНИЕ 1
я создаю класс
class SonataTemplateRegistry implements MutableTemplateRegistryInterface
{
/**
* @var string[]
*/
private $templates = [];
/**
* @param string[] $templates
* @param ContactService $contactService
*/
public function __construct(array $templates = [], ContactService $contactService)
{
$templates['layout']= '@SonataAdmin/layout1.html.twig';
// $templates['layout']= '@SonataAdmin/standard_layout.html.twig';
// echo '<pre>'; var_dump($templates); die();
$this->templates = $templates;
}
зарегистрировать
sonata.admin.global_template_registry:
class: App\Service\SonataTemplateRegistry
public: true
arguments: ['%sonata.admin.configuration.templates%', '@mea.contact']
класс запущен - die () показывает шаблоны, но основной шаблон не изменяется, когда я меняю здесь.
Обновление 2
в классе администратора, когда я получаю шаблон макета, я получаю правильный @ SonataAdmin / layout1.html.twig
protected function configureListFields(ListMapper $listMapper)
{
var_dump($this->configurationPool->getTemplate('layout'));
но он не загружен, все еще смотрите @ SonataAdmin / standard_layout.html.twig
ОБНОВЛЕНИЕ 3
Я обнаружил странное поведение - администратор сонаты главной страницы - переключение шаблона работает, но уже под страницами используется шаблон по умолчанию
ОБНОВЛЕНИЕ 4
Я нашел что-то интересное, у каждой админ-панели есть под-сервис, как здесь:
php bin/console debug:container |grep app.admin.social
app.admin.social.accounts App\SocialManager\Admin\SocialAccountAdmin
app.admin.social.accounts.template_registry Sonata\AdminBundle\Templating\TemplateRegistry
app.admin.social.order App\SocialManager\Admin\SocialManagementOrderAdmin
app.admin.social.order.template_registry Sonata\AdminBundle\Templating\TemplateRegistry
я переопределяю параметры:
parameters:
sonata.admin.global_template_registry: App\Service\SonataTemplateRegistry
и сервис
sonata.admin.global_template_registry:
class: App\Service\SonataTemplateRegistry
public: true
arguments: ['%sonata.admin.configuration.templates%', '@mea.contact']
так почему соната все еще использует Sonata \ AdminBundle \ Templating \ TemplateRegistry
protected function configureListFields(ListMapper $listMapper)
{
$this->getTemplateRegistry()
дать Sonata \ AdminBundle \ Templating \ TemplateRegistry