web-dev-qa-db-ja.com

ルールの日付フィールドの比較

ノードの更新で日付フィールドの値が変更されたかどうかを確認しようとしています。 (ルール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を返し、理由はわかりません。

メモ

  • 提案された変更を証明しても、結果は変わりません。ノードを編集し、「tria」フィールドの値を変更してもしなくても、trueを返します。
  • データ比較を(一時的に)省略した場合は、最後のメッセージが表示されます。これは、私がセットアップで得ているものの例です。このコンテンツタイプのノードを編集します。ノードの「tria」フィールドにはすでに日付データがあります。何も変更せずに保存します。メッセージを表示します。そのフィールド値を別の値に変更して保存した場合。メッセージも表示されます。したがって、彼女はデータ比較を正しく行っていないため、ノードの変更されていない値は空である必要があります。
  • 以下は、コンテンツを保存/更新した後の変数のデバッグです。デバッグ値パラメーター:デバッグする値:[node-unchanged:field-tria] ...(配列、1要素)0(配列、6要素)値(文字列、19文字)2001-01-10 01:00:00 value2(文字列、19文字)2001-01-10 01:00:00デバッグ値パラメータ:デバッグする値:[node:field-tria] ...(配列、1要素)0(配列、10要素)値(文字列、19文字)2001-01-20 01:00:00 value2(文字列、19文字)2001-01-20 01:00:00値があります、そして彼らは違う!予想通り!
  • ノードが異なる値で更新されると、ルール評価ログにこれが表示されます: enter image description here

値が変更されずにノードが更新されると、ルール評価ログにこれが表示されます...保存されました enter image description here

4
Carlos Solé

パート1-念のため

「エンティティにフィールドがある」などの追加のルール条件を追加し、それに関連するfield-tria、そのデータ比較を行う既存のルール条件の前。

それでも問題が解決しない場合は、(一時的に)データ比較を削除して、メッセージがルールイベント/条件(エンティティにそのフィールドがあること)のようなシナリオで表示されるようにします。この場合でもメッセージが表示されない場合は、ルールに本当に問題があります(たとえば、間違ったルールイベントを使用しているなど)。

パート2-ルールのデバッグが必要

上記の方法で問題が解決しない場合は、「 条件内の変数の値を表示するにはどうすればよいですか? 」で説明されているように、ルールのデバッグを開始して、ルールの詳細を確認することをお勧めします期待どおりに動作しないようです。

パート3-データ比較が機能しない理由

あなたの追加コメントのとおり、「this is a multi value field」:これは、ルールが奇妙に動作するように見える理由をほぼ説明しています...ルールに必要なすべての情報を提供せずに、ルールに何かをさせる(2つの値を比較する)。

私があなたに10杯のビール(それぞれ独自のラベルが付いている)を見せて、もう1杯も見せて、「これも同じですか?」と尋ねると、予想される質問は「次のようになります。それらの10のグラスのどれと比較して?」これは、現在のルールで起こっていることと似ています。

前進する方法

あなたの Rules イベントは確かに大丈夫ですが、重要なルールアクション:aルールLoopがありません。このようなループに慣れていない場合は、「 リストとループ 」というタイトルのチュートリアルを参照することを強くお勧めします。

あなたの場合、その日付のリストに関連するループを追加する必要があります(これは複数値フィールドであることが確認されています)。その後、リスト内の各アイテム(=各日付)を反復処理する必要があります。そして、反復ごとに、現在実行しようとしている「同等のルール条件」を実行する必要がありますが、現在の反復で処理されているリスト項目を使用する必要がありますステップ)。

正直なところ、上記で完全なソリューションに近づくと思いますが、残りの課題は、「それぞれの日付と比較される日付値(単一の値)を指定する方法」です。リスト項目?」私が間違っている場合は私を訂正してください。

PS:この答えは(ほぼ)D7に関連しています。

4
Pierre.Vriens

ここでの問題は、日付フィールドが複数値フィールドであることでした。したがって、データ比較は機能しません。その関数を使用する代わりに、(多くのデバッグの後。@ 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;
}
}
2
Carlos Solé