2016-07-27 5 views
1

Я знаю, что мы можем настроить ссылки на действия, которые мы хотим в списке просмотра оу в нашем классе лица администратора благодаря:SonataAdmin - Как добавить свою логику до отображения конкретных действий ссылки

$listMapper 
    ->addIdentifier('name') 
    ->add('minRole') 
    ->add('_action', null, [ 
     'actions' => [ 
      'show' => [], 
      'edit' => [], 
      'delete' => [] 
     ] 
    ]) 
; 

или управлять роли благодаря служба: sonata.admin.security.handler.role

в моем случае, я хотел бы добавить логику домена, чтобы отобразить или нет кнопки удаления (он появится в списке вида и видередактирования).

{% if attribute(object, hasEvents) is defined and not object.hasEvents %} 
    # display it 
{% endif %} 

Я не знаю, как переопределить шаблоны ветви сонаты, чтобы сделать это. Только два объекта: Event и Post.

EDIT

для списка просмотра Я непосредственно переопределить list__action_delete.html.twig шаблон (я создал app/Resources/SonataAdminBundle/views/CRUD/list__action_delete.html.twig) и это код (я знаю, что это не лучший способ ...):

{# 

The template override the basic one in order to prevent the display of the delete button (in the view list) for the entities 
Post and Event. We only display it if they don't have associated activities. 

#} 
{% if admin.isGranted('DELETE', object) and admin.hasRoute('delete') %} 
    {% if not attribute(object, 'isDeleteable') is defined %} 
     <a href="{{ admin.generateObjectUrl('delete', object) }}" class="btn btn-sm btn-default delete_link" title="{{ 'action_delete'|trans({}, 'SonataAdminBundle') }}"> 
      <i class="fa fa-times"></i> 
      {{ 'action_delete'|trans({}, 'SonataAdminBundle') }} 
     </a> 
    {% else %} 
     {% if object.isDeleteable %} 
      <a href="{{ admin.generateObjectUrl('delete', object) }}" class="btn btn-sm btn-default delete_link" title="{{ 'action_delete'|trans({}, 'SonataAdminBundle') }}"> 
       <i class="fa fa-times"></i> 
       {{ 'action_delete'|trans({}, 'SonataAdminBundle') }} 
      </a> 
     {% endif %} 
    {% endif %} 
{% endif %} 

ответ

1

В качестве примера я покажу вам решение с шаблоном редактирования. Вы должны следовать одному и тому же подходу для поиска любых других частей/блоков/шаблонов, которые вы хотите переопределить.

Что вы хотите сделать, это переопределить/расширить формы блок шаблона редактирования. Блок определяется в base_edit_form.html.twig шаблона сонатных админ пачки:

vendor/sonata-project/admin-bundle/Resources/views/CRUD/base_edit_form.html.twig 

Для переопределения шаблона существует разные подходы. Вы можете использовать подход, как описано в symfony doc about how to override any part of a bundle, или вы можете использовать config options to override the path for some of the sonata templates as described in the docs.

Я рекомендую использовать последний. Допустим, у вас есть AppBundle и вы хотите использовать это, чтобы переопределить шаблон. Добавьте эти строки в сонатной конфигурации раздела в файле app/config/config.yml:

sonata_admin: 
    templates: 
     edit: AppBundle:CRUD:edit.html.twig 

Создайте файл src/AppBundle/Resources/views/CRUD/edit.html.twig и скопировать в formactions блок из vendor/sonata-project/admin-bundle/Resources/views/CRUD/base_edit_form.html.twig шаблона в него. Не забудьте продлить base_edit.html.twig шаблон (первая линия), входящий в комплект поставки сонатной пачке:

{% extends 'SonataAdminBundle:CRUD:base_list.html.twig' %} 

{% block formactions %} 
    ... 
{% endblock formactions %} 

Найти кнопку удаления в formactions блок и добавить свой обычай, если заявление сделать какой-либо манипуляции вы хотели сделать.

+0

Большое спасибо за ваш четкий ответ, поскольку страница редактирования работает отлично, но вместо этого я использовал блок 'sonata_form_actions' :) –