【发布时间】: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);
}
}
}
【问题讨论】:
标签: symfony sonata-admin