web-dev-qa-db-fra.com

Comment comparer la valeur déjà enregistrée du nœud et la valeur mise à jour?

Je veux comparer par programme une valeur de champ d'un nœud dans hook_node_update(). Comment puis-je obtenir les valeurs déjà enregistrées et mises à jour?

5
Iqbal

Ma suggestion consiste à utiliser un moyen simple, enregistrer le gestionnaire de soumission personnalisé, puis avant de sauvegarder les éléments, comparer la valeur du champ soumis avec la valeur enregistrée.

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() , qui appelle hook_node_update(), contient le code suivant.

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

Ainsi, chaque fois qu'un nœud est mis à jour, $node->original contiendra l'objet nœud avant sa mise à jour.

Pour obtenir, par exemple, la valeur du champ champ_exemple avant la mise à jour, vous utilisez le code suivant.

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

Pour obtenir la valeur mise à jour pour le même champ, vous utilisez le code suivant.

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