我尝试在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
答案 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'
%}