ノードの更新で日付フィールドの値が変更されたかどうかを確認しようとしています。 (ルールDrupal 7)
これが私のルール設定です:
{ "rules_node_update" : {
"LABEL" : "Update",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "rules" ],
"ON" : { "node_presave--expedient" : { "bundle" : "expedient" } },
"IF" : [
{ "entity_has_field" : { "entity" : [ "node-unchanged" ], "field" : "field_tria" } },
{ "NOT data_is" : {
"data" : [ "node-unchanged:field-tria" ],
"value" : [ "node:field-tria" ]
}
}
],
"DO" : [ { "drupal_message" : { "message" : "UPDATED DATE" } } ]
}
}
イベント:保存する前(ノードの更新をすでに試しました)
NOTデータ比較パラメータ:比較するデータ:[node:field-tria]、データ値:[node-unchanged:field-tria]
ここで私がしようとしていることは...(新しい)日付値IS変更されていないフィールド値(古い)と等しくない場合)...次に何かを行います。画面)
データ比較の結果は常にTRUEを返し、理由はわかりません。
メモ:
「エンティティにフィールドがある」などの追加のルール条件を追加し、それに関連するfield-tria
、そのデータ比較を行う既存のルール条件の前。
それでも問題が解決しない場合は、(一時的に)データ比較を削除して、メッセージがルールイベント/条件(エンティティにそのフィールドがあること)のようなシナリオで表示されるようにします。この場合でもメッセージが表示されない場合は、ルールに本当に問題があります(たとえば、間違ったルールイベントを使用しているなど)。
上記の方法で問題が解決しない場合は、「 条件内の変数の値を表示するにはどうすればよいですか? 」で説明されているように、ルールのデバッグを開始して、ルールの詳細を確認することをお勧めします期待どおりに動作しないようです。
あなたの追加コメントのとおり、「this is a multi value field」:これは、ルールが奇妙に動作するように見える理由をほぼ説明しています...ルールに必要なすべての情報を提供せずに、ルールに何かをさせる(2つの値を比較する)。
私があなたに10杯のビール(それぞれ独自のラベルが付いている)を見せて、もう1杯も見せて、「これも同じですか?」と尋ねると、予想される質問は「次のようになります。それらの10のグラスのどれと比較して?」これは、現在のルールで起こっていることと似ています。
あなたの Rules イベントは確かに大丈夫ですが、重要なルールアクション:aルールLoopがありません。このようなループに慣れていない場合は、「 リストとループ 」というタイトルのチュートリアルを参照することを強くお勧めします。
あなたの場合、その日付のリストに関連するループを追加する必要があります(これは複数値フィールドであることが確認されています)。その後、リスト内の各アイテム(=各日付)を反復処理する必要があります。そして、反復ごとに、現在実行しようとしている「同等のルール条件」を実行する必要がありますが、現在の反復で処理されているリスト項目を使用する必要がありますステップ)。
正直なところ、上記で完全なソリューションに近づくと思いますが、残りの課題は、「それぞれの日付と比較される日付値(単一の値)を指定する方法」です。リスト項目?」私が間違っている場合は私を訂正してください。
PS:この答えは(ほぼ)D7に関連しています。
ここでの問題は、日付フィールドが複数値フィールドであることでした。したがって、データ比較は機能しません。その関数を使用する代わりに、(多くのデバッグの後。@ Piere.Vriensのおかげで)phpで独自のバリデーターを作成することを選択しました。これは次のように簡単です。
if(isset($node->field_tria['und'])){
$day1 = $node->field_tria['und'][0]['value'];
$day2 = $node_unchanged->field_tria['und'][0]['value'];
if ($day1 != $day2) {
return true;
}
}