Не разрешать пользователю удалять узел, но разрешать удалять с помощью 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, который удаляет кнопку удаления из редактирования узла формы, как они построены.

В целом, похоже, что у роли есть разрешение на удаление узлов, или нет, и подобные манипуляции будут менее надежными, чем вам хотелось бы.

Другие вопросы по тегам