プログラムでhook_node_update()
のノードのフィールド値を比較したい。保存済みおよび更新済みの値を取得するにはどうすればよいですか?
私の提案は、簡単な方法を使用することです。カスタム送信ハンドラーを登録してから、アイテムが保存される前に、送信されたフィールドの値と保存された値を比較します。
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
}
}
}
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');