web-dev-qa-db-ja.com

ノードの編集時にcckフィールドの値が変更されたかどうかを検出します

Drupal 6.25、CCK 2.9

タイプEVENTのノードがあります。 EVENTノードには、ユーザーがワークフローに入るイベントをカレンダーに送信できるようにするいくつかのCCKフィールドが含まれています。ユーザーがイベントでITサポートを要求した場合、ITサポート担当者にメールが送信されます。食事付きのイベントを主催する場合は、ケータリングスタッフに通知されます。

後でリクエストに応じてイベントを編集できることを除いて、すべてがうまくいきます。私たちが行った編集が、スタッフに通知するために使用されるこれらの値の1つを変更する場合、それらの人々に自動的に通知するシステムが必要です。

通知の処理方法や他のすべての方法はうまく機能していますが、単一のフィールドの状態が変化しているかどうかを検出する方法はわかりません。

詳細な例:

---イベント情報... ---

イベントでITサポートが必要ですか?

  • 講義を録音する必要があります。
  • ソフトウェアのインストールを手伝ってくれる人が必要です。
  • ビデオ会議
  • 特別リクエスト

(複数のチェックボックス)

---その他のイベント情報... ---

そのEVENTノードが送信され、承認され、後で編集されてそのフィールドの値が変更されて、ボックスの1つがオンになっている場合は、それを処理する必要があります。

これを処理するカスタムモジュールがあり、検証と送信処理を書いた経験がありますが、$ formまたは$ form_stateのどの値がこのタスクに役立つかわかりません。元々はhook_form_FORM_ID_alterを使用して非表示フィールドとしてフィールドの値を保存し、送信された値に対してその非表示の値をチェックする可能性があると考えましたが、値をキャプチャする必要があるため、CCK値を非表示フィールドに取得するのは困難です#after_build関数で...行き詰まってしまい、助けを求めたいと思っていました。

お時間とご検討をよろしくお願いいたします。

編集-以下のJimajammaからの提案に基づく私の解決策:

_function sitecustom_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  // If we are saving an EVENT node...
  if ('presave' == $op && 'event' == $node->type) {
    // If the node already exists...
    if ($existing = node_load($node->nid)) {
      // If the FIELD_EVENT_TECH_SUPPORT value has changed...
      if ($node->field_event_tech_support == $existing->field_event_tech_support) {
        // Log the change.
        watchdog('event_edit', 'FIELD_EVENT_TECH_SUPPORT value did not change');
      } else {
        // Notify people accordingly.
        // TODO: Notification of staff of changed tech support for EVENT.
        // Log the notification.
        watchdog('event_edit', 'Event edited with FIELD_EVENT_TECH_SUPPORT value changed. Staff notified.');
      }
    }
  }
  // Handle other nodeapi uses, validation, etc.
}
_

if ($existing = node_load($node->nid))を実行するのが正しいかどうか正確にはわかりません。なぜなら、EVENTノードが最初から作成されている場合でも、そのブロックは実行されているように見えるためです。 if ($existing->created != $existing->changed)を使用できることはわかっていますが、まだ何もテストしておらず、正確に何を検討しているのか、まだ考えていません。今のところ、上記で示したものを使用しても、この通知はトリガーされません。ノードが新しい場合。

将来人々がこれを見つけた場合に備えて、解決策に関してここで何かを得たかっただけだと思います。時間の許す限り、ルールとアクションを使ってこれをより簡単に/見つけられるようにする方法を探っていきます。

3
mechler

私はこれを行っていませんが、私の最初のアイデアはnodeapi()でこれを行い、(この恐ろしい疑似コード)の行に沿って何かを行うことです:

if ( $op == 'presave' and $node->type == 'event' ) :
   $existing = node_load($node->nid);
   if ( $existing ) :
       check your fields in $node against the $existing node
       if they are different do something

また、ITやケータリングが不要になる可能性があることを考慮に入れてください。そのため、それが必要な場合と同様に、それを伝える必要があります。

3
Jimajamma