J'ajoute certains champs d'un type de contenu dans un formulaire personnalisé en utilisant field_attach_form (). Lorsque le formulaire est soumis, je traite ces champs en appelant field_attach_form_validate () et field_attach_submit () à partir des rappels #validate et #submit.
À ce stade, je veux comparer l'objet de nœud préparé post-soumission au nœud d'origine et ne le dérange que pour node_save () si l'un des champs a changé. Par conséquent, je commence par charger le nœud d'origine à l'aide de entity_load_unchanged()
.
Malheureusement, les tableaux de champs dans l'objet nœud d'origine ne correspondent pas aux tableaux de champs dans l'objet nœud préparé qui attend d'être enregistré, même si aucune modification n'a été apportée aux champs, donc un simple "$ old_field == $ new_field "la comparaison est impossible. Par exemple, un simple champ de texte apparaît comme ceci dans l'original:
$old_node->field_text['und'][0] = array(
'value' => 'Test',
'format' => NULL,
'safe_value' => 'Test',
);
Alors que dans le nœud préparé, cela apparaît comme ceci.
$node->field_text['und'][0] = array(
'value' => 'Test',
);
Vous pourriez penser à comparer simplement la clé «valeur», mais vous rencontrez ensuite des champs composés d'autres éléments qui n'ont pas de clé «valeur». Par exemple, regardons un champ d'adresse où il n'y a pas de clé «valeur» et il y a des clés dans les nœuds anciens et préparés qui n'ont pas d'homologues.
Ancien noeud
$old_node->field_address['und'][0] = array(
'country' => 'GB',
'administrative_area' => 'Test',
'sub_administrative_area' => NULL,
'locality' => 'Test',
'dependent_locality' => NULL,
'postal_code' => 'Test',
'thoroughfare' => 'Test',
'premise' => 'Test',
'sub_premise' => NULL,
'organisation_name' => 'Test',
'name_line' => 'Test',
'first_name' => NULL,
'last_name' => NULL,
'data' => NULL,
);
Noeud préparé
$node->field_address['und'][0] = array(
'element_key' => 'node|page|field_address|und|0',
'thoroughfare' => 'Test',
'premise' => 'Test',
'locality' => 'Test',
'administrative_area' => 'Test',
'postal_code' => 'Test',
'country' => 'GB',
'organisation_name' => 'Test',
'name_line' => 'Test',
);
Pour les champs vides, il existe encore un autre écart.
Ancien noeud
$old_node->field_text = array();
Noeud préparé
$node->field_text = array(
'und' => array(),
);
Puis-je comparer de manière générique l'ancienne et la nouvelle valeur d'un champ pour détecter s'il a changé ou non?
Est-ce juste une impossibilité?
_field_invoke()
ou quelque chose de similaire pour préparer la structure complète des champs à partir du nœud "préparé", rendre les deux champs et simplement comparer ces chaînes HTML. Juste une idée.