web-dev-qa-db-ja.com

単一のルールで複数のルールアクションを起動する方法は?

Drealtyモジュールを使用した不動産ウェブサイトがあります。不動産RETSフィードには、「Area」という数値フィールドがあります。その数値は特定のエリアを参照しています。たとえば、「22」は「マイアミビーチ」、「32」は「マイアミビーチ」と「サウスビーチ」のようになります。

(drushのコマンドラインを介して)新しい不動産リストが作成されると、特定の分類法から選択するエリアの対応する「詳細」名が必要になります。たとえば、RETSフィードがエリア値として「22」を返す場合、リスティングエンティティのその分類フィールドで「Miami Beach」をチェックする必要があります。同様に、RETSフィードが「48」を返す場合は、「マイアミビーチ」と「サウスビーチ」の両方をチェックする必要があります。

各エリアの数値にルールコンポーネントを作成しました。マイアミビーチルールコンポーネントは以下のとおりです。

 { "rules_set_area_miami_miami_beach" : {
 "LABEL" : "Set Area - Miami - Miami Beach",
 "PLUGIN" : "rule",
 "OWNER" : "rules",
 "REQUIRES" : [ "rules" ],
 "USES VARIABLES" : { "drealtylisting" : { "label" : "drealtylisting", "type" : "drealty_listing" } },
 "IF" : [
   { "entity_has_field" : { "entity" : [ "drealtylisting" ], "field" : "field_area" } },
   { "entity_has_field" : { "entity" : [ "drealtylisting" ], "field" : "field_area_taxonomy_" } },
   { "data_is" : {
       "data" : [ "drealtylisting:field-area" ],
       "op" : "IN",
       "value" : { "value" : [ "22", "32" ] }
     }
   }
 ],
 "DO" : [
   { "data_set" : {
       "data" : [ "drealtylisting:field-area-taxonomy-" ],
       "value" : { "value" : { "35" : "35" } }
     }
   }
  ]
 }
}

同じタイプのルールコンポーネントがサウスビーチにも存在します。

  { "rules_set_area_miami_south_beach" : {
  "LABEL" : "Set Area - Miami - South Beach",
  "PLUGIN" : "rule",
  "OWNER" : "rules",
  "REQUIRES" : [ "rules" ],
  "USES VARIABLES" : { "drealtylisting" : { "label" : "drealtylisting", "type" : "drealty_listing" } },
  "IF" : [
    { "entity_has_field" : { "entity" : [ "drealtylisting" ], "field" : "field_area" } },
    { "entity_has_field" : { "entity" : [ "drealtylisting" ], "field" : "field_area_taxonomy_" } },
    { "data_is" : {
        "data" : [ "drealtylisting:field-area" ],
        "op" : "IN",
        "value" : { "value" : [ "32" ] }
      }
    }
  ],
  "DO" : [
    { "data_set" : {
        "data" : [ "drealtylisting:field-area-taxonomy-" ],
        "value" : { "value" : { "23" : "23" } }
      }
    }
  ]
 }
}

次に、イベント「新しい不動産リストを保存した後」とアクション「ルール:エリアの設定-マイアミ-マイアミビーチ」と「エリアの設定-マイアミ-サウスビーチ」のルールを作成しました。

    { "rules_set_area_on_drealty_listing_cloned_" : {
    "LABEL" : "Set Area on Drealty Listing (cloned)",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "drealty" ],
    "ON" : { "drealty_listing_insert" : [] },
    "DO" : [
      { "component_rules_set_area_miami_miami_beach" : { "drealtylisting" : [ "drealty-listing" ] } },
      { "component_rules_set_area_miami_south_beach" : { "drealtylisting" : [ "drealty-listing" ] } }
    ]
  }
}

RETSインポートを実行し、Webサイトが新しいリストを作成すると、それらのルールアクションのそれぞれを連続して評価し、必要に応じて分類ボックスをオンにすることが期待されていましたが、サウスビーチルールアクションのみが有効になっているようです。したがって、そのフィールドではサウスビーチのみがチェックされます。これは、ルールアクションリストの最後にリストされているためですか?これを設定して、望ましい最終結果を得ることができるより良い方法はありますか?

2
hockey2112

「データセット」が表示されます。これは99%の確信がありますが、フィールドが1つの値に設定されていることを意味します。または、分類法では、データを設定すると以前の値が上書きされる可能性があります。したがって、ルールは単にお互いを上書きする可能性があります。

タクソノミーについてはあまり覚えていませんが、まだフィールドがない場合はフィールドを無限値に変更し、可能な場合は「アクションリストにアイテムを追加する」というルールアクションを使用します。

別の注記として、「プロパティによってエンティティを取得する」アクションを利用し、おそらくすべてに対して1つのルールのみを持つ必要があります。したがって、分類項目に整数フィールドを追加し、ルールアクションを使用して、提供された整数を使用してフィールドをフェッチします。試してみたい場合はお知らせください。

2
Niall Murphy

以下は、同じ結果を達成するための可能な代替策です(「に従って)これを設定して、目的の結果を得ることができるより良い方法はありますか?結果? ")...

Conditional Rules モジュールを使用して、これら2つの(類似した)ルールを1つのルールに統合しようとする場合があります。各ルールの条件は、類似の「if条件」(ルールアクション)、および各グループのルールアクションは、「if条件」がtrueの場合にのみ実行されます。 Conditional Rules モジュールを使用したサンプル(利用可能なドキュメントが多くない)については、質問への私の回答を参照してください " 使用時にノードが保存されないようにする方法ルールモジュール? "。

ルールアクション内でConditional(if/else)ロジックを使用する代わりに、Switchロジック。

注意してください:このモジュールは8K以上のサイトで使用されていますが、D7のベータリリースのみです(そのため、かなり堅牢なモジュールのように見えます)。

1
Pierre.Vriens