如何在奏鸣曲管理列表视图中添加“后备标签”

Posted

技术标签:

【中文标题】如何在奏鸣曲管理列表视图中添加“后备标签”【英文标题】:How to add a "fallback label" in sonata admin list views 【发布时间】:2017-07-05 14:48:12 【问题描述】:

我在 Sonata Admin 列表视图中显示一些实体关系。问题:当不存在关系时(在我的情况下是合法的)表格单元格保持为空:

我想要的基本上是这样的:

我试图覆盖默认模板 (base_list_field.html.twig):

$listMapper
    ->add(
        'example',
        null,
        array(
            'template' => 'AppBundle:Admin:listItemWithFallback.html.twig'
        )
    )
;

但即使我只扩展默认模板,现有引用的所有链接也会停止工作。我也不知道在哪里添加我的后备。我的AppBundle:Admin:listItemWithFallback.html.twig 看起来像这样:

% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %

有了这个结果:

即使我将整个代码从 base_list_field.html.twig 复制到我自己的模板中,链接也会停止工作。

那么:如何在不覆盖整个默认模板的情况下添加后备标签?我想尽可能少地修改基本模板。

编辑:

这是使用kernel.event_listener 的解决方法,希望有更好的方法来实现此目的:

services.yml:

services:
    empty_cells.listener:
        class: AppBundle\Listener\EmptyAdminTableCellListener
        arguments:
            - '@translator'
        tags:
           -  name: kernel.event_listener, event: kernel.response, method: onKernelResponse 

EmptyAdminTableCellListener.php:

namespace AppBundle\Listener;

use Symfony\Component\Translation\TranslatorInterface;
use Symfony\Component\HttpKernel\Event\FilterResponseEvent;

class EmptyAdminTableCellListener

    /**
     * @var TranslatorInterface
     */
    protected $translator;

    /**
     * @param TranslatorInterface $translator
     */
    public function __construct(TranslatorInterface $translator)
    
        $this->translator = $translator;
    

    /**
     * @param FilterResponseEvent $event
     */
    public function onKernelResponse(FilterResponseEvent $event)
    
        $request = $event->getRequest();
        $path    = $request->getPathInfo();

        if (strpos($path, '/admin/') !== false) 
            $emptyText = $this->translator->trans('Not set', [], 'admin');
            $response  = $event->getResponse();
            $content   = $response->getContent();

            $content   = preg_replace(
                ';(<td[^>]*?>)[\s]+?(</td>);is',
                sprintf('$1%s$2', $emptyText),
                $content
            );

            $response->setContent($content);
        
    

【问题讨论】:

【参考方案1】:

以下是在自定义模板中重新创建工作链接的方法:

<a href="admin.configurationPool.getAdminByAdminCode('librinfo_varieties.admin.species').generateObjectUrl('show', object.species)"> value </a>

与后备和所有:

% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %

% block field %
    % if object.species %
        <a href="admin.configurationPool.getAdminByAdminCode('librinfo_varieties.admin.species').generateObjectUrl('show', object.species)"> value </a>
    % else %
        'Your fallback text'|trans() 
    % endif %
% endblock %    

希望有帮助

【讨论】:

以上是关于如何在奏鸣曲管理列表视图中添加“后备标签”的主要内容,如果未能解决你的问题,请参考以下文章

抽象类的奏鸣曲管理员:如何按子类属性过滤

如何使用奏鸣曲管理员创建自定义列表

奏鸣曲管理员:列表始终使用默认语言

如何在编辑时设置奏鸣曲形式 data_class

奏鸣曲管理员列表可编辑与编辑/显示冲突

在树枝视图中访问 Symfony 断言