Шаблон переопределения Admin Sonata зависит от пользователя - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь переопределить шаблон макета в 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

Ответы [ 2 ]

0 голосов
/ 30 июня 2019

Вы можете сделать это, используя один шаблон Twig:

{# layout.html.twig #}
{# mutatis mutandis #}

{% extends app.user ?
    ('ROLE_ADMIN' in app.user.role ?
        'admin_layout.html.twig' :
        'customer_layout.html.twig'
    ) :
    'fallback.html.twig'
%}
0 голосов
/ 30 июня 2019

Вы можете использовать обходные пути по служебным тегам.Сначала создайте свой собственный реестр шаблонов и внедрите MutableTemplateRegistryInterface.Затем создайте проход компилятора.

<?php

namespace App\DependencyInjection\Compiler;

use App\Registry\TemplateRegistry;
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Reference;

/**
 * Class SonataAdminTemplateRegistryPass
 * @package App\DependencyInjection\Compiler
 */
class SonataAdminTemplateRegistryPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        foreach ($container->findTaggedServiceIds('sonata.admin.template_registry') as $id => $tags)
        {
            //because @see src/vendor/sonata-project/admin-bundle/src/DependencyInjection/Compiler/AddDependencyCallsCompilerPass.php:405
            $adminServiceId = str_replace(".template_registry", "", $id);
            $def            = $container->getDefinition($adminServiceId);
            $def->removeMethodCall('setTemplateRegistry');
            $def->addMethodCall('setTemplateRegistry', [new Reference(TemplateRegistry::class)]);
        }
    }

}

, затем добавьте проход компилятора в src / Kernel.php следующим образом

protected function build(ContainerBuilder $container)
{
    $container->addCompilerPass(new SonataAdminTemplateRegistryPass());
}

И вы всегда будете иметь возможность переопределить TemplateRegistry в любом классе администратора.Таким образом, вы можете реализовать свою собственную логику в своем собственном TemplateRegistry:)

...