如何在奏鸣曲管理列表视图

时间:2017-02-16 13:05:16

标签: symfony sonata-admin

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

enter image description here

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

enter image description here

我尝试覆盖默认模板(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' %}

结果如下:

enter image description here

即使我将整个代码从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);
        }
    }
}

enter image description here

1 个答案:

答案 0 :(得分:0)

以下是如何在自定义模板中重新创建工作链接:

<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 %}    

希望有所帮助