Не разрешать пользователю удалять узел, но разрешать удалять с помощью Bulk Operations в Views
У меня есть следующий сценарий:
- Роль редактора не должна позволять удалять узлы. Поэтому соответствующее разрешение отменено на странице разрешений.
- Однако редактор должен иметь возможность удалять узлы из операций Bulk для Views. Используя правила, создается действие, называемое "безопасное удаление", которое проверяет такие вещи, как, если узел не опубликован и т. Д., Перед удалением узла.
Проблема заключается в том, что Views Bulk Operations уважает права доступа Node. Редактор не сможет удалить узел, так как ему не было дано такое разрешение. Есть ли способ, чтобы Editor мог стать пользователем с более высокой ролью (как своего рода sudo) при выполнении этого действия в VBO? В качестве альтернативы есть ли способ сказать VBO игнорировать доступ к узлу для этого действия?
Я уверен, что это основное требование, но я не могу найти решение.
Решения, которые не включают программирование, будут предпочтительными.
4 ответа
Простой, но не очень чистый путь - это маршрут, который вы уже выбрали, но с дополнительным небольшим модулем, который вам в этом поможет.
- имеет функцию
my_module_can_delete($user)
, что возвращаетTRUE
если пользователю разрешено удалять,FALSE
если пользователь не. - инвентарь
hook_form_alter()
изменить и удалить кнопку в форме node_edit, еслиmy_module_can_delete($user)
- инвентарь
hook_form_alter()
изменить форму подтверждения, которая вызывается в /node/%nid/delete, и добавить туда сообщение, сообщающее пользователю, что он или онаmy_module_can_delete($user)
, Этого должно быть достаточно, так как отключение этой формы приведет к тому, что пользователи не смогут пройти через эту форму. FORM-API позаботится об этом.
Тем не менее, вы можете сделать его более надежным, чтобы поймать другие модули удаления:
- инвентарь
hook_nodeapi()
,$op == 'delete'
поймать удалить действия и остановить (вызываяdrupal_goto()
или звонитdrupal_access_denied()
чтобы обеспечить пользовательскую ошибку. Отлавливайте delete-actions только в том случае, если реферером была форма delete-verify, как указано выше. Или, более безопасно, внесите в белый список ваше VBO-действие и верните false всем остальным реферерам. Реферер часто можно найти, прочитав $ узел, переданныйhook_nodeapi()
,
ИМХО, гораздо более чистая, но, вероятно, более интенсивная альтернатива, состоит в том, чтобы просто убедиться, что ваши пакеты / действия вызываются при каждом действии удаления.
В модуле вы можете сделать это, избегая всех настроек VBO и оставляя все дополнительные действия по удалению. Затем напишите модуль, который реализует hook_nodeapi()
а затем вызывает все действия по очистке оттуда. Таким образом, вы можете быть уверены, что ваши delete-действия вызываются для каждого delete-action на любом узле. Очевидно, что вы можете добавить некоторые условия в свой hook_nodeapi(), чтобы вызывать ваши модули только в определенных случаях (типы узлов, роли пользователей, разрешения и т. Д.).
Я поймал это на некоторое время, пока не заметил модуль "actions_permissions", включите его, и на странице Permissions вы можете предоставить доступ к определенным действиям для каждой роли.
Что ж, мне кажется, у вас есть установка, в которой вы не хотите, чтобы пользователи Editor Role действительно что-то удаляли, за исключением определенных экстремальных ситуаций. Вот мое предложение:
1) Установите флаговый модуль. Создайте флаг "Для удаления", который может быть назначен только сотрудникам редактора.
2) Я не изучал это, но я уверен, что, возможно, есть комбинация правила или триггера / действия, которая отменяет публикацию узла, когда ему назначен флаг "Будет удален". Это удалит узел из случайного просмотра.,
3) Затем либо задайте какое-либо действие по запуску cron (триггер / действие или правило), чтобы удалить узлы с установленным на них флагом "Быть удаленным", либо иногда приходите другим пользователям с более высокими разрешениями и удаляйте помеченные элементы.
Таким образом, вы фактически не обходите систему разрешений, и все же с вашего сайта все еще удаляются.
У меня нет хорошего решения без кодирования, и я не уверен, что назвал бы это решение "отличным", но одним из способов может быть реализация простого модуля с хуком form_alter, который удаляет кнопку удаления из редактирования узла формы, как они построены.
В целом, похоже, что у роли есть разрешение на удаление узлов, или нет, и подобные манипуляции будут менее надежными, чем вам хотелось бы.