Каков правильный способ программного обновления существующих правил модуля?
Я хочу предоставить обновление для моего пользовательского модуля, в котором также есть некоторые правила, предоставляемые через hook_default_rules_configuration
.
Теперь, как я могу обновить эти существующие правила? Могу ли я их повторно импортировать? Как-то их переопределить? Я не могу найти ничего об этом в документальном фильме или соответствующем крючке.
Похоже, есть крючок для реагирования на обновляемые правила, поэтому я предполагаю, что должен быть способ предоставлять обновления для пользовательских правил...
Сначала я подумал, что это hook_default_rules_configuration_alter но, похоже, он работает не так, как ожидалось, так как я просто хочу импортировать JSON.
Например, используя представления, я могу просто загрузить все файлы .inc
и сохранить их через views_save_view
как в этом вопросе - разве в правилах нет аналогичного способа?
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
Чтобы обновить правила модуля программно, вы можете загрузить их и изменить. Пример удаления одного действия :
$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.