Как вызвать правило A до или после выполнения правила B?

У меня есть представление, отображающее контент. Я использую VBO (Views Bulk Operations) для выбора набора строк в представлении и выполнения некоторых массовых операций. Эта операция выполняет компонент Rule, в котором фактическая операция, которая должна быть выполнена, предоставляется как действие правила.

Но я хочу выполнить некоторые действия PHP до и после выполнения вышеуказанного компонента Rule. Есть ли способ сделать это? Используя представления?

3 ответа

Решение

Поскольку я не нашел другого решения, я взломал файл views_bulk_operations.module, чтобы выполнить свою работу.

В views_bulk_operations_execute() функция, добавьте код, который вы хотите выполнить "до" выполнения компонента правил. В цикле foreach, предоставленном в функции, добавьте свой пользовательский код.

Если вы хотите выполнить свой код только один раз, тогда используйте условие $current==2 внутри цикла foreach. Если вы хотите выполнить свой код только для одного конкретного представления, получите текущий путь к представлению в $token переменной и сравните его с вашим путем просмотра, как показано в следующем коде.

foreach ($selection as $row_index => $entity_id) {
$rows[$row_index] = array(
  'entity_id' => $entity_id,
  'views_row' => array(),
  // Some operations rely on knowing the position of the current item
  // in the execution set (because of specific things that need to be done
  // at the beginning or the end of the set).
  'position' => array(
    'current' => $current++,
    'total' => count($selection),
  ),
);

//Custom Code starts
$token = strtok(request_path(),"/"); // Path of the view
if($current==2 && $token == '<view path>') // Execute only once for the specified view
{
    /* Your code that is to be executed before executing the rule component */
}
// Custom Code ends

// Some operations require full selected rows.
if ($operation->needsRows()) {
  $rows[$row_index]['views_row'] = $vbo->view->result[$row_index];
}
}

В views_bulk_operations_execute_finished() добавьте код, который вы хотите выполнить "после", выполняя компонент правил чуть выше последней строки _views_bulk_operations_log($message);,

Я использовал пользовательский модуль для создания собственного действия с помощью hook_action_info (). Вы можете использовать руководство на Drupal.org, чтобы помочь вам создать свое собственное действие.

Часть создания пользовательского действия включает объявление функции обратного вызова, которая принимает строку и $context массив, структурированный следующим образом:Структура массива контекста, переданного в обратный вызов действия

Используя этот элемент прогресса, вы можете определить, насколько далеко вы выполняете массовое выполнение. Таким образом, ваш код может выглядеть примерно так:

function my_module_action_my_operation(&$row, $context = array()) {
  // Stuff to do before we start with the list
  if($context['progress']['current'] == 1) {
    do_pre_processing_stuff_here();
  }

  // Programmatically call the Rule component here. 
  // Do any other operations per $row

  if($context['progress']['current'] == $context['progress']['total']) {
    do_post_processing_stuff_here();
  }
}

Просто вставьте 2 действия, которые вы хотите выполнить до и после целевого действия.

В зависимости от вашей проблемы, поскольку у вас есть действие VBO, существует набор переменных: параметр. Вы должны добавить 2 новые переменные для 2 действий. Один как параметр (до) и один как предусмотрено (после), а затем добавьте 2 действия, принимая значения из действия до.

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

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