Я реализовал действие клонирования точно так же, как в документации. Как я могу ограничить доступ к действию клонирования для пользователя, создавшего объект?Как сделать пользовательское действие недоступным в зависимости от пользователя - Администратор сонаты
У меня уже есть проверка запрета на доступ в моем действии, но как я могу скрыть кнопку в представлении списка, если пользователь не является автором этого объекта. Пользователь должен по-прежнему иметь возможность перечислить заказ и отобразить его.
Это мой маршрут:
protected function configureRoutes(RouteCollection $collection)
{
$collection->add('clone', $this->getRouterIdParameter().'/clone');
}
И мой список полей:
protected function configureListFields(ListMapper $listMapper)
{
$listMapper
->add('_action', 'actions', array(
'actions' => array(
'show' => array(),
'edit' => array(),
'clone' => array(
'template' => 'AppBundle:Sonata/Button:clone_button.html.twig'
),
), 'label' => 'Actions'
))
;
}
и мой клон действия:
public function cloneAction($id = null)
{
$object = $this->admin->getSubject();
if (!$object) {
throw new NotFoundHttpException(sprintf('Unable to find the object with id : %s', $id));
}
If (!$object->isAuthor($this->getUser())) {
throw new AccessDeniedException();
}
$clonedObject = clone $object;
$this->admin->create($clonedObject);
$this->addFlash('sonata_flash_success', 'Cloned successfully');
return new RedirectResponse($this->admin->generateUrl('edit', array('id' => $clonedObject->getId())));
}
Как вы можете увидеть в моем клоне действии, я попросите проверить, является ли пользователь автором заказа. Но как я могу полностью удалить кнопку в списке, проверив мою функцию isAuthor
?
Потому что теперь пользователь может видеть кнопку, но если он несанкционирован, чтобы клонировать заказ, и он нажимает кнопку, он получает исключение, исключающее доступ. Поэтому я вообще не хочу показывать кнопку. То же самое относится к кнопке редактирования.
Я думал, что-то вроде этого:
protected function configureRoutes(RouteCollection $collection)
{
$user = $this->getConfigurationPool()->getContainer()->get('security.token_storage')
->getToken()->getUser();
If (!$object->isAuthor($user)) {
$collection->remove('edit');
$collection->remove('clone');
}
}
Но, видимо, это не может быть сделано.
Есть ли у кого-нибудь идеи, как это сделать?
ОК, это сделает некоторые вещи, которые я должен сделать действительно проще. Но теперь остается вопрос, как я могу скрыть маршрут, если у пользователя нет доступа? Кнопка останется там, и если кто-то щелкнет по ней, будет выбрано исключение. Я хочу, чтобы кнопка отображалась только в том случае, если пользователь может ее использовать. Это легко сделать, если я работаю с чистым Symfony. Но теперь я пользуюсь Сонатой. –
Проверьте шаблон, но, как я уже сказал, в нем, вероятно, есть чек? Или, может, ты сам написал шаблон? Он должен использовать 'is_granted()' с маршрутом и объектом, и это вызовет избирателя. – greg0ire
Итак, шаг 0, если вы хотите решить это, найдите и покажите нам шаблон для кнопки – greg0ire