У меня есть сущность «Файл», и я хочу показать логическое значение существующего связанного файла в файловой системе. Для проверки существования нужно использовать мой сервис DirectoriesManager, который может обнаружить, что использует этот объект File. Как правильно настроить ListMapper для этой задачи или ее можно решить только переписав некоторые шаблоны сонаты?
Итак, что я сделал:
config.yml
twig:
debug: '%kernel.debug%'
strict_variables: '%kernel.debug%'
globals:
container: '@service_container'
Мой Sonata Admin класс
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->add('id')
->add('exist', null, [
'template' => 'AdminBundle:Files:exist.html.twig'
]);
}
И мой шаблон Существовать.html.twig
{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}
{% block field %}
{% set value = container.get('dirs_manager').entityFileExist(object) %}
{% if value %}
{% set text = 'label_type_yes'|trans({}, 'SonataAdminBundle') %}
{% else %}
{% set text = 'label_type_no'|trans({}, 'SonataAdminBundle') %}
{% endif %}
{% if value %}
{% set class = 'label-success' %}
{% else %}
{% set class = 'label-danger' %}
{% endif %}
<span class="label {{ class }}">{{ text }}</span>
{% endblock %}
Где служба DirectoriesManager имеет псевдоним dirs_manager.
Я знаю, что в Yii2 можно настроить столбцы виджетов GridView с обратным вызовом для всех моделей, которые показывают любое значение. Может быть, я могу сделать что-то вроде в ListMapper?
Я бы добавил обратный вызов слушателя для события postLoad доктрины. И внутри этого обратного вызова будет использовать службу и установить соответствующее значение логического объекта.
Других решений пока нет …