Мне наконец удалось, но я не уверен, что это лучшее решение.
Я использую моего избирателя , который управляет моей собственной логикой. В моей административной сущности я перезаписываю шаблон для «редактирования».
class ProjectAdmin extends AbstractAdmin
{
...
public function getTemplate($name)
{
switch ($name) {
case 'edit':
return 'Sonata/ProjectAdmin/edit.html.twig';
break;
default:
return parent::getTemplate($name);
break;
}
}
...
}
Я создал свой шаблон в templates/Sonata/ProjectAdmin/edit.html.twig
содержит:
{% extends 'SonataAdminBundle:CRUD:base_edit.html.twig' %}
{% use 'SonataExtends/base_edit_form.html.twig' with form as parentForm %}
{% block form %}
{{ block('parentForm') }}
{% endblock %}
Затем я скопировал / вставил vendor/sonata-project/admin-bundle/src/Ressources/views/CRUD/base_edit_form.html.twig
в templates/SonataExtends/base_edit_form.html.twig
Я заменил блок:
{% if admin.hasRoute('delete') and admin.hasAccess('delete', object) %}
{{ 'delete_or'|trans({}, 'SonataAdminBundle') }}
<a class="btn btn-danger" href="{{ admin.generateObjectUrl('delete', object) }}">
<i class="fa fa-minus-circle" aria-hidden="true"></i> {{ 'link_delete'|trans({}, 'SonataAdminBundle') }}</a>
{% endif %}
для вызова моего избирателя:
{% if admin.hasRoute('delete') and is_granted('delete', object) %}
{{ 'delete_or'|trans({}, 'SonataAdminBundle') }}
<a class="btn btn-danger" href="{{ admin.generateObjectUrl('delete', object) }}">
<i class="fa fa-minus-circle" aria-hidden="true"></i> {{ 'link_delete'|trans({}, 'SonataAdminBundle') }}</a>
{% endif %}
Единственная разница is_granted('delete', object)
вместо admin.hasAccess('delete', object)
Как я уже сказал, это может быть не лучшим способом продолжить, поэтому спасибо, что поправили меня. Но мне не удалось переопределить логику admin.hasAccess («удалить», объект).
Для других административных классов мне нужно только использовать мою функцию getTemplate
для использования этой логики.
PS:
Я также добавил этот код в свой класс администратора для управления действием удаления:
public function preRemove($project){
if (false === $this->getConfigurationPool()->getContainer()->get('security.authorization_checker')->isGranted('delete', $project)) {
throw new AccessDeniedHttpException();
}
}