2010-09-11 3 views
4

Я следующий сценарий:Не позволяет пользователю удалить узел, но позволяет удалить через Views Bulk Operations

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

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

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

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

ответ

2

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

  • имеет функцию my_module_can_delete($user), которая возвращает TRUE, если пользователю разрешено удалять FALSE, если пользователь не является.
  • реализует hook_form_alter() изменять и удалять кнопки на форме node_edit, если my_module_can_delete($user)
  • реализует hook_form_alter() изменить форму подтверждения, что называется на/узел /% нидь/удалять и добавлять сообщение там, сообщая пользователю, он или она my_module_can_delete($user). Этого должно быть достаточно, так как отключение этой формы приведет к тому, что пользователи не смогут пройти эту форму. FORM-API позаботится об этом.

Однако, вы можете сделать его более прочным, чтобы поймать другие удаляющие модули:

  • реализует hook_nodeapi(), $op == 'delete' поймать удалить действия и привал (путем вызова drupal_goto(), или позвонив по телефону drupal_access_denied() для обеспечения соблюдения USER- error. Только улавливайте действия удаления, если референт был формой-подтверждением-подтверждением, как указано выше. Или, более безопасно, белый список вашего VBO-действия и возвращает false для всех других рефери.Необходимо найти референта, узел прошел до hook_nodeapi().

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

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

0

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

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

+0

Я рассмотрел это, но используя URL/node/[nid]/delete также удалит узел. Таким образом, хотя кнопка, возможно, не существует, удаления все еще возможны. Спасибо за ваше время! –

1

Ну, мне кажется, что у вас есть настройка, где вы не хотите, чтобы пользователи Редакторской роли удаляли вещи, действительно, за исключением некоторых экстремальных ситуаций. Вот мое предложение:

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

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

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

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

+1

Единственная проблема может заключаться в том, что cron работает как анонимный пользователь в большинстве установок, и я не могу вспомнить, выполняются ли правила, разрешенные cron. – mirzu

1

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

+0

Вы использовали этот модуль? Так может ли кто-то иметь возможность удалять узлы с помощью VBO, не имея возможности удалить узел через обычный метод редактирования - удалить - удалить? –