以编程方式更新现有模块规则的正确方法是什么?


8

我想为我的自定义模块提供更新,该更新也通过提供了一些规则hook_default_rules_configuration

现在,如何更新这些现有规则?我可以重新导入它们吗?以某种方式覆盖它们?我在纪录片或各自的钩子中找不到任何关于这个的信息

似乎有一个钩子可以响应正在更新的规则,所以我想必须有一种方法可以为自定义规则提供更新...

起初我以为它是hook_default_rules_configuration_alter,但由于我只想导入JSON,所以它似乎没有按预期工作。

例如,使用视图,我可以像在这个问题中那样简单地加载所有.inc文件并保存它们-规则中是否存在类似的方式?views_save_view

Answers:


7

您可以通过Rules UI导出规则配置,然后像下面这样实现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();
}

一个示例用法可能是在自定义模块的更新功能期间执行此操作。

似乎要删除它,但是删除和还原对于代码所提供的规则是等效的,因为删除意味着从数据库中删除。如果这是通过UI创建的规则,那么它将消失,但是来自代码的规则只会从数据库中删除,然后再次从代码中读取。

不幸的是,当前只有drush命令用于启用/禁用规则。https://www.drupal.org/node/2507187上有一个功能要求删除/还原命令


那正是我尝试过的,但似乎没有用。我再试试看。
亚历克斯(Alex)

最后,我添加了有关还原的部分。可能是缺少的信息。
rooby

有趣的一点!因此,当我更新规则时,hook_default_rules_configuration我可以还原规则,以便应用任何更新。那很聪明,但是:我可以按规则强制还原吗?我可以以编程方式执行此操作吗?
亚历克斯(Alex)

是的,我在答案的底部添加了信息。
rooby 2015年

通过查看ui.forms.inc,function我得出了非常相似的结论rules_ui_confirm_operation_apply。您还可以在此处启用和禁用。感谢您的大力帮助!我会稍作尝试,并在一分钟内接受您的回答
Alex

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中。

请参阅:用于API的RulesPlugin

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.