web-dev-qa-db-ja.com

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

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

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

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

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

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

8
Alex

ルール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 に削除/元に戻すコマンドの機能リクエストがあります

7
rooby

モジュールのルールをプログラムで更新するには、それらを読み込んで変更します。単一の削除の例 action

$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 を参照してください。

2
kenorb