I try to override layout template in Sonata Admin but depends of logged user. If logged user belong to group customers has some ROLE - show other layout.
I want change -
layout" => "@SonataAdmin/standard_layout.html.twig"
Where is best place to do it ?
I found that i can do this in admin class - override getTemplate.
But is possible to do this is some listener and switch globaly without edit admin classes ?
UPDATE 1
i create class
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;
}
register it
sonata.admin.global_template_registry:
class: App\Service\SonataTemplateRegistry
public: true
arguments: ['%sonata.admin.configuration.templates%', '@mea.contact']
class is fired - die() show templates but main template is not changed when i change here.
Update 2
in admin class when i get layout template i get correct @SonataAdmin/layout1.html.twig
protected function configureListFields(ListMapper $listMapper)
{
var_dump($this->configurationPool->getTemplate('layout'));
but it is not loaded, still see @SonataAdmin/standard_layout.html.twig
UPDATE 3
I found a strange behavior - main page sonata admin - switching template works but already under the pages use the default template
UPDATE 4 I found something interesting , each admin panel has sub service like here :
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
i override parameters :
parameters:
sonata.admin.global_template_registry: App\Service\SonataTemplateRegistry
and service
sonata.admin.global_template_registry:
class: App\Service\SonataTemplateRegistry
public: true
arguments: ['%sonata.admin.configuration.templates%', '@mea.contact']
so why sonata still use Sonata\AdminBundle\Templating\TemplateRegistry
protected function configureListFields(ListMapper $listMapper)
{
$this->getTemplateRegistry()
give Sonata\AdminBundle\Templating\TemplateRegistry