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

8

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

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

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

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

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

Alex
источник

Ответы:

7

Вы можете экспортировать конфигурацию правил через пользовательский интерфейс Rules, а затем реализовать 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 () . Либо приемлемо.

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

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

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

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

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

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

rooby
источник
это именно то, что я пытался, но это не сработало. Я попробую еще раз.
Алекс
Я добавил часть в конце о возвращении. Возможно, это недостающая информация.
Роби
интересный момент! поэтому, когда я обновляю свои правила, hook_default_rules_configurationя могу отменить правила, чтобы применить любые обновления. это умно, но: могу ли я принудительно вернуться по правилу? я могу сделать это программно?
Алекс
Да, я добавил информацию в конец ответа.
Роби
Я пришел к очень похожему выводу, изучив функцию ui.forms.inc rules_ui_confirm_operation_apply. Здесь вы также можете включить и отключить. Спасибо за вашу большую помощь! Я немного попробую и приму ваш ответ через минуту
Алекс
2

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

$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.

kenorb
источник