プログラムで既存のモジュールのルールを更新する正しい方法は何ですか?


8

カスタムモジュールの更新を提供したいと考えています。これには、を介して提供されるいくつかのルールもありますhook_default_rules_configuration

これらの既存のルールを更新するにはどうすればよいですか?再インポートできますか?どういうわけかそれらをオーバーライドしますか?ドキュメンタリーまたはそれぞれのフックでこれについて何も見つけることができません。

更新されているルールに応答するためのフックがあるようですので、カスタムルールの更新を提供する方法が必要だと思います...

最初はhook_default_rules_configuration_alterだと思っていましたが、JSONをインポートしたいだけなので、期待どおりに動作しないようです。

たとえば、ビューを使用.incするとviews_save_view 、この質問のようにすべてのファイルをロードして保存できます-ルールに同様の方法はありませんか?

回答:


7

ルール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']ルールのマシン名を使用するようにのインスタンスを変更し、エクスポート文字列を独自のものに置き換えます。

entity_import()の代わりにrules_import()を使用することもできます。どちらでもかまいません。

ルールモジュールはデフォルトルールをコードからデータベースにロードし、それ以降はデータベースからロードするため、オーバーライドをすぐには取得しません。これを行うには、ルールUIに移動してルールを元に戻します。オーバーライドするデフォルトのコードに戻ります。

プログラムでルールを元に戻すには、次のようにします(ここでも、ルールマシン名を置き換えます)。

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

その使用例としては、カスタムモジュールの更新機能中に実行する場合があります。

削除しているように思われるかもしれませんが、削除はデータベースから削除することを意味するため、コードによって提供されるルールの削除と復帰は同等です。これがUIを介して作成されたルールである場合、それはなくなりますが、コードからのルールはDBから削除され、コードから再度読み込まれます。

残念ながら現在のところ、ルールを有効/無効にするためのdrushコマンドしかありません。https://www.drupal.org/node/2507187で削除/元に戻すコマンドの機能リクエストがあります


それはまさに私が試したものですが、うまくいかなかったようです。もう一度やってみます。
アレックス

元に戻す部分を最後に追加しました。おそらくそれが不足している情報です。
rooby

面白いポイント!ルールを更新すると、ルールをhook_default_rules_configuration元に戻すことができるため、すべての更新が適用されます。それは賢明ですが、ルールごとに強制的に元に戻すことはできますか?これをプログラムで実行できますか?
アレックス

はい、私は答えの下部に情報を追加しました。
rooby

関数ui.forms.incを調べることで、非常によく似た結論に達しました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();

1回限りの変更の場合は、hook_updateに追加します。

参照:APIのRulesPlugin

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.