Как вызвать правило 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 действия, принимая значения из действия до.
Если набор правил действия не разрешает дополнительные переменные, вы должны клонировать его.