web-dev-qa-db-ja.com

すでに保存されているノードの値と更新された値を比較するにはどうすればよいですか?

プログラムでhook_node_update()のノードのフィールド値を比較したい。保存済みおよび更新済みの値を取得するにはどうすればよいですか?

5
Iqbal

私の提案は、簡単な方法を使用することです。カスタム送信ハンドラーを登録してから、アイテムが保存される前に、送信されたフィールドの値と保存された値を比較します。

function yourmodule_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id === 'contenttype_node_form') { // Replace contenttype
      array_unshift($form['#submit'], 'my_custom_submit_handler')
  }
}

function my_custom_submit_handler($form, &$form_state) {
   if(!empty($form_state['values']['nid'])){
   // Load the current node object
  $node = node_load($form_state['values']['nid']); 

  // Display the current node object's values
//  dsm($node);

  // Display the submitted values
  //dsm($form_state['values']);
if($form_state['values']['yourfield']['und'][0]['value'] != $node->yourfield['und'][0]['value']){
// do what you want here
  }
 }

}

1
Yusef

node_save() は、hook_node_update()を呼び出し、次のコードを含みます。

// Load the stored entity, if any.
if (!empty($node->nid) && !isset($node->original)) {
  $node->original = entity_load_unchanged('node', $node->nid);
}

したがって、ノードが更新されるたびに、$node->originalは、更新される前のノードオブジェクトを含みます。

たとえば、更新前のfield_exampleフィールドの値を取得するには、次のコードを使用します。

$old_value = field_get_items('node', $node->original, 'field_example');

同じフィールドの更新された値を取得するには、次のコードを使用します。

$new_value = field_get_items('node', $node, 'field_example');
7
kiamlaluno