Не разрешать пользователю удалять узел, но разрешать удалять с помощью Bulk Operations в Views - PullRequest
4 голосов
/ 11 сентября 2010

У меня есть следующий сценарий:

  • Роль редактора должна позволять не удалять узлы.Поэтому соответствующее разрешение отменено на странице разрешений.
  • Однако Редактор должен иметь возможность удалять узлы из операций Bulk для Views.Используя правила, создается действие, называемое «безопасное удаление», которое проверяет такие вещи, как, если узел не опубликован и т. Д., Перед удалением узла.

Проблема заключается в том, что массовые операции представлений уважают разрешения узла.Редактор не сможет удалить узел, так как ему не было дано такое разрешение.Есть ли способ, чтобы Editor мог стать пользователем с более высокой ролью (как своего рода sudo) при выполнении этого действия в VBO?В качестве альтернативы есть ли способ сказать VBO игнорировать доступ к узлу для этого действия?

Я уверен, что это основное требование, но я не могу найти решение.

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

Ответы [ 4 ]

2 голосов
/ 27 сентября 2010

Простой, но не очень чистый путь - это уже пройденный вами маршрут, но с дополнительным небольшим модулем, помогающим ему.

  • имеет функцию 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().

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

В модуле вы можете сделать это, избегая всех настроек VBO и оставляя все дополнительные действия по удалению. Затем напишите модуль, который реализует hook_nodeapi(), а затем вызывает все действия по очистке оттуда. Таким образом, вы можете быть уверены, что ваши delete-действия вызываются для каждого delete-action на любом узле. Очевидно, что вы можете добавить некоторые условия в свой hook_nodeapi (), чтобы вызывать ваши модули только в определенных случаях (типы узлов, роли пользователей, разрешения и т. Д.).

1 голос
/ 07 ноября 2011

Я на некоторое время поймал это, пока не заметил модуль "actions_permissions", включите его, и на странице Permissions вы можете предоставить доступ к определенным действиям для каждой роли в отдельности.

1 голос
/ 27 сентября 2010

Что ж, мне кажется, у вас есть настройка, в которой вы не хотите, чтобы пользователи Editor Role действительно что-то удаляли, за исключением определенных экстремальных ситуаций. Вот мое предложение:

1) Установите флаговый модуль. Создайте флаг «Будет удален», который может быть назначен только сотрудникам редактора.

2) Я не смотрел на это, но я уверен, что, возможно, есть комбинация правила или триггера / действия, которая отменяет публикацию узла, когда ему назначен флаг «Будет удален». Это удалит узел от случайного взгляда.

3) Затем либо задайте какое-либо действие cron run (триггер / действие или правило), чтобы удалить узлы с установленным на них флагом 'To Be Deleted', либо время от времени заходите другим пользователям с более высокими разрешениями и удаляйте отмеченные элементы .

Таким образом, вы фактически не обходите систему разрешений, и все же с вашего сайта все еще удаляются.

0 голосов
/ 12 сентября 2010

У меня нет хорошего решения без кодирования, и я не уверен, что назвал бы это решение "отличным", но одним из способов может быть реализация простого модуля с хуком form_alter, который удаляет кнопку удаления из формы редактирования узлов по мере их сборки.

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

...