Программно создать Action для Rules

Часто стандартных наборов правил для Rules не хватает и возникает необходимость выполнить свой php-код. Включать на сайте модуль php нельзя! Ибо это черевато соблазнами добавить какой-то код в базу данных, а это не drupal-way и черевато проблемами и ошибками. Итак, для того чтобы выполнить какое-то своё действие при срабатывании события по Rules, надо реализовать ряд хуков:

/**
 * Implement hook_rules_action_info()
 
 * Declare any meta data about actions for Rules
 */
 
function zz_np_rules_action_info() {
  $actions = array(
    'zz_np_actions_hello_world' => array(
      'label' => t('Print Hello World on the page'),
      'group' => t('Rules Example'),
    ),
    'zz_np_actions_hello_user' => array(
      'label' => t('Print Hello to the logged in user'),
      'group' => t('Rules Example'),
      'parameter' => array(
        'account' => array(
          'type' => 'user',
          'label' => t('User to say hello to'),
        ),
      ),
    ),
    'zz_np_actions_complete_checkout' => array(
      'label' => t('Taobao complete checkout'),
      'group' => t('Taobao'),
      'parameter' => array(
        'account' => array(
          'type' => 'commerce_order',
          'label' => t('A completed order'),
        ),
      ),
    ),
  );
 
  return $actions;
}
 
/**
 * The action function for rules_example_action_hello_world
 */
 
function zz_np_actions_hello_world() {
  drupal_set_message(t('Hello World'));
} 
 
/** 
 * The action function for rules_example_action_hello_user
 */
 
function zz_np_actions_hello_user($account) {
  drupal_set_message(t('Hello @username', array('@username' => $account->name)));
}
 
function zz_np_actions_complete_checkout($commerce_order) {
  krumo($commerce_order); die;
}

Дальше просто создаем новое правило (Rule) и выставляем ему action наше новое правило. Например, если это правило по завершению покупки, мы идем в /admin/commerce/config/checkout/rules, добавялем новое правило, и при добавлении action нас спрашивают передаваемый параметр. В данном случае это commerce-order, так и пишем, он там уже в правиле изначально заложен. Сохраняем. Радуемся.

Если надо программно выполнить правило (например, для тестирования), надо выполнить команду:

$order = commerce_order_load(10);
rules_invoke_component('zz_np_actions_complete_checkout', $order);

Удачи!

Drupal 7

Комментарии

Олег 07.12.2014 - 12:04

Никита, если вас не затруднит опишите как работает Рулес совместно с Флагом. Интересует функция " При нажатии на флаг тремя разными пользователями 3 раза, комментарий снимается с публикации и отправляется письмо администратору с адресом снятого с публикации комментария для проверки"

Nikita Petrov 07.12.2014 - 15:27

Если вкратце то, нужно поставить счётчик flag чтобы уникальную статистику считать, и при каждом action "отмечание флага у ноды" проверять - если этот флаг больше 3, то отсылать уведомление админу.

Добавить комментарий