Каков правильный способ программного обновления существующих правил модуля?


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

Теперь, как я могу обновить эти существующие правила? Могу ли я их повторно импортировать? Как-то их переопределить? Я не могу найти ничего об этом в документальном фильме или соответствующем крючке.

Похоже, есть крючок для реагирования на обновляемые правила, поэтому я предполагаю, что должен быть способ предоставлять обновления для пользовательских правил...

Сначала я подумал, что это hook_default_rules_configuration_alter но, похоже, он работает не так, как ожидалось, так как я просто хочу импортировать JSON.

Например, используя представления, я могу просто загрузить все файлы .inc и сохранить их через views_save_view как в этом вопросе - разве в правилах нет аналогичного способа?

Author: Community, 2015-08-04

2 answers

Вы можете экспортировать конфигурацию правил через пользовательский интерфейс правил, а затем реализовать hook_default_rules_configuration_alter() следующим образом:

/**
 * Implements hook_default_rules_configuration_alter().
 */
function MODULENAME_default_rules_configuration_alter(&$data) {
  if (isset($data['commerce_cart_add_to_cart_message'])) {
    $data['commerce_cart_add_to_cart_message'] = entity_import('rules_config', '{ "commerce_cart_add_to_cart_message" : {
        "LABEL" : "Display an Add to Cart message",
        "PLUGIN" : "reaction rule",
        "OWNER" : "rules",
        "TAGS" : [ "Commerce Cart" ],
        "REQUIRES" : [ "rules", "commerce_cart" ],
        "ON" : { "commerce_cart_product_add" : [] },
        "IF" : [
          { "data_is" : { "data" : [ "commerce-order:commerce-nocart" ], "value" : "0" } }
        ],
        "DO" : [
          { "commerce_cart_add_to_cart_message" : { "commerce_product" : [ "commerce-product" ] } }
        ]
      }
    }');
  }
}

Просто измените экземпляры $data['commerce_cart_add_to_cart_message'], чтобы использовать имя вашей машины правил, и замените строку экспорта своей собственной.

Вы также можете использовать rules_import() вместо entity_import(). И то, и другое приемлемо.

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

Чтобы программно отменить правило, вы можете сделать это (снова заменив имя машины правил):

if ($rules_config = rules_config_load('commerce_cart_add_to_cart_message')) {
  $rules_config->delete();
}

Примером использования этого может быть выполнение этого во время функции обновления для пользовательского модуля.

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

К сожалению, в настоящее время существуют только команды drush для включения/выключения правил. Существует запрос функции для команды удаления/возврата по адресу https://www.drupal.org/node/2507187

 7
Author: rooby, 2015-08-04 13:30:07

Чтобы обновить правила модуля программно, вы можете загрузить их и изменить. Пример удаления одного действия :

$rule = rules_config_load("some_rule");
foreach ($rule->actions() as $action) {
  if (strpos($action->getPluginName(), 'drupal_message') !== FALSE) {
    $action->delete();
  }
}
$rule->save();

Если это однократное изменение, добавьте его в hook_update.

См.: Rulesplugin для API.

 2
Author: kenorb, 2016-06-29 15:59:58