カスタムモジュールの更新を提供したいと思います。これには、hook_default_rules_configuration
を介して提供されるいくつかのルールもあります。
これらの既存のルールを更新するにはどうすればよいですか?それらを再インポートできますか?どういうわけかそれらをオーバーライドしますか? ドキュメンタリーまたはそれぞれのフック でこれについて何も見つけることができません。
更新されているルールに応答するためのフックがあるようですので、カスタムルールの更新を提供する方法が必要だと思います...
最初は hook_default_rules_configuration_alter だと思っていましたが、JSONをインポートしたいだけなので期待どおりに動作しないようです。
たとえば、ビューを使用すると、すべての.inc
ファイルをロードしてviews_save_view
経由で保存できます この質問のように -ルールに同様の方法はありませんか?
ルール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 に削除/元に戻すコマンドの機能リクエストがあります
モジュールのルールをプログラムで更新するには、それらを読み込んで変更します。単一の削除の例 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 を参照してください。