web-dev-qa-db-ja.com

条件付きルールモジュールを使用する代わりの方法は何ですか?

Conditional Rules モジュールでは、ルールアクションをルールアクションに含めることができます(If/Elseコンストラクト) Rules モジュールを使用するだけではできないことです。 条件付きルール を使用して解決できる典型的な質問のいくつか(多くのうち)を以下に示します。

ただし、次のような 条件付きルール モジュールにはいくつかの問題があります。

  • 正式な D7のリリース はまだありません。
  • これに関するドキュメントは多くありません(コミュニティのドキュメントもありません)。
  • このモジュールが誤った結果を生成するシナリオがいくつかあります。

同等の Rules ロジックを構築するための代替ソリューションはありますか? Conditional Rules モジュールを使用する必要はありませんか?

5
Pierre.Vriens

Conditional Rules モジュールを使用したいカスタムルールの場合は、対応するルールコンポーネントを作成し、同様のルールアクションを実行できますが、追加のルール条件を使用して、条件付きルールモジュールを使用して含める必要があります。次に、元のルールのルールアクション内でそのルールコンポーネントを実行します。

次のプロトタイプの例を検討してください(「IDによるエンティティの取得」、「変数の設定」などの前のルールアクションを含む、より複雑なルールの簡略化バージョンであると想定してください)。

{ "rules_show_a_message_using_conditional_rules" : {
    "LABEL" : "Show a message using Conditional Rules",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules_conditional", "rules" ],
    "ON" : { "node_delete--page" : { "bundle" : "page" } },
    "DO" : [
      { "CONDITIONAL" : [
          {
            "IF" : { "NOT data_is" : { "data" : [ "node:promote" ], "value" : "1" } },
            "DO" : [
              { "drupal_message" : { "message" : "Bingo ... using \u0022Conditional Rules\u0022 ..." } }
            ]
          }
        ]
      }
    ]
  }
}

ルールコンポーネントを使用した場合の同等の機能を次に示します。

{ "rules_show_a_message_using_a_rules_component" : {
    "LABEL" : "Show a message using a Rules Component",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "ON" : { "node_delete--page" : { "bundle" : "page" } },
    "DO" : [ { "component_rules_say_bingo" : { "current_node" : [ "node" ] } } ]
  }
}

そして、関連するルールコンポーネントは次のようになります。

{ "rules_say_bingo" : {
    "LABEL" : "Say bingo",
    "PLUGIN" : "rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : { "current_node" : { "label" : "Current node", "type" : "node" } },
    "IF" : [
      { "NOT data_is" : { "data" : [ "current-node:promote" ], "value" : "1" } }
    ],
    "DO" : [
      { "drupal_message" : { "message" : "Bingo ... using a Rules Component instead of \u0022Conditional Rules\u0022 ..." } }
    ]
  }
}

ルールコンポーネントを使用した代替策の詳細:

  • 条件付きルール構成内のルール条件は、ルールコンポーネントのルール条件になりました。
  • 実行される実際のルールアクションは、ルールコンポーネントのルールアクションに移動されました。
  • 元のルールはルールコンポーネントを呼び出すだけで、処理するノードをルールコンポーネントのパラメーターとして渡します。
  • 元のルールのルールイベントは変更されていません。元のルールに追加のルール条件があった場合、それらも変更されませんでした。

:上記は、ソリューションの重要な部分を説明するための単なる「概念」です。このプロトタイプは、以前のアクションとして以前の「IDによるエンティティのフェッチ」(または「変数の設定」または「現在のユーザーポイントの読み込み」)を必要としなかったためです。

6
Pierre.Vriens