Как отменить публикацию узлов по автору, если автору назначена роль

Я использую Drupal 7 + Правила. Я хотел бы создать правило, которое отменяет публикацию всех узлов, созданных пользователем, когда им была дана определенная роль.

  • СОБЫТИЕ — после обновления существующей учетной записи пользователя
  • УСЛОВИЕ – у пользователя есть роли: SelectedRole
  • ДЕЙСТВИЕ - ???

БОНУС: Если бы это можно было ограничить узлами определенного типа, было бы еще лучше.

Если есть лучший способ сделать это вне правил, я открыт для других идей.

Большое спасибо!


person areikiera    schedule 09.09.2013    source источник


Ответы (1)


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

Самый простой вариант — добавить пользовательскую функцию PHP в правило (PHP > Выполнить пользовательский код PHP). Конечно, вы должны включить модуль ядра php filter, если вы еще этого не сделали.

В действии PHP вы должны получить все nids опубликованных узлов текущего пользователя и пройтись по ним, чтобы отменить их публикацию. Я буду использовать класс API EntityFieldQuery, но вы можете использовать базу данных функционирует.

// Get updated user id    
$uid = $account -> uid;

// Get all nodes from user that are of NODE_TYPE and are published
$query = new EntityFieldQuery();
$query
  ->entityCondition('entity_type', 'node')
  ->entityCondition('bundle', 'NODE_TYPE')
  ->propertyCondition('status', 1)
  ->propertyCondition('uid', $uid);

$result = $query->execute();
$nids = array_keys($result['node']);

// Load all nodes in one go for better performance.
$nodes = node_load_multiple($nids);
foreach ($nodes as $node) {
  // set status property to 0 (unpublished)
  $node->status = 0;
  // re-save the node
  node_save($node);
}

Я бы также предложил добавить еще одно условие для пользователя перед тем, которое вы используете: User Has Roles: (NOT) SelectedRole, чтобы действие не выполнялось каждый раз, когда профиль пользователя обновлен.

Использованная литература:

person TheodorosPloumis    schedule 10.09.2013
comment
Это сработало отлично! Спасибо! У меня к вам дополнительный вопрос, если не возражаете. Вместо того, чтобы реализовать это в правиле, я создаю с ним собственный модуль. Мне пришлось немного добавить в пользовательскую область, чтобы получить переменные $account, но я получаю сообщение об ошибке Undefined index: node для этой строки $nids = array_keys($result['node']);. Знаете ли вы, что мне нужно сделать, чтобы определить «узел»? - person areikiera; 12.09.2013
comment
Запрос одинаков для каждого подхода (модуль, правила и т.д.). Я думаю, что ошибка в том, что вы не получаете переменную $account. Распечатайте визуализацию $account, чтобы убедиться, что я прав. - person TheodorosPloumis; 13.09.2013
comment
Может быть дело. Мой модуль работает с модулем Recurly, и кажется, что процессы Recurly происходят за кулисами, поэтому у меня возникают проблемы с печатью переменной $account. Однако это отменяет публикацию правильных узлов, созданных пользователем с обработанным uid (полученным $uid = $account-›uid;), поэтому я предположил, что это означает, что переменная $account доступна. С другой стороны, я получаю Попытка получить свойство уведомления об отсутствии объекта в dblog в строке $account = user_load($account-›entity_id);. Вы доступны для внештатной работы/отладки? - person areikiera; 13.09.2013
comment
Похоже, ваш код работал отлично. Я добавил некоторый код для перенаправления и отображения сообщения после назначения роли, который не работал. Я опубликую это как отдельный вопрос, если не смогу устранить неполадки самостоятельно. Еще раз большое спасибо! - person areikiera; 13.09.2013