Sonata Admin Override模板取决于用户

时间:2019-04-05 07:42:56

标签: symfony sonata-admin sonata

我尝试在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    

i覆盖参数:

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 :(得分:0)

您可以使用服务标签来解决。 首先创建您自己的Template注册表并实现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中实现自己的逻辑:)

答案 1 :(得分:0)

您可以使用单个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'
%}