Sto aggiungendo alcuni campi da un tipo di contenuto in un modulo personalizzato utilizzando field_attach_form (). Quando il modulo viene inviato, sto elaborando quei campi chiamando field_attach_form_validate () e field_attach_submit () da #validate e #submit callbacks.
A quel punto, voglio confrontare l'oggetto nodo preparato post-invio con il nodo originale e preoccuparmi solo di node_save () se uno dei campi è cambiato. Pertanto, inizio caricando il nodo originale utilizzando entity_load_unchanged()
.
Sfortunatamente, le matrici di campi nell'oggetto nodo originale non corrispondono alle matrici di campi nell'oggetto nodo preparato che è in attesa di essere salvato, anche se non sono state apportate modifiche ai campi, quindi un semplice "$ old_field == $ new_field "il confronto è impossibile. Ad esempio, un semplice campo di testo appare così nell'originale:
$old_node->field_text['und'][0] = array(
'value' => 'Test',
'format' => NULL,
'safe_value' => 'Test',
);
Mentre nel nodo preparato appare così.
$node->field_text['und'][0] = array(
'value' => 'Test',
);
Potresti pensare di confrontare semplicemente la chiave "valore", ma poi ti imbatti in campi costituiti da altri elementi che non hanno chiavi "valore". Ad esempio, diamo un'occhiata a un campo indirizzo in cui non esiste una chiave 'value' e ci sono chiavi sia nei nodi vecchi che preparati che non hanno controparti.
Nodo vecchio
$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,
);
Nodo preparato
$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',
);
Per i campi vuoti, c'è ancora un'altra discrepanza.
Nodo vecchio
$old_node->field_text = array();
Nodo preparato
$node->field_text = array(
'und' => array(),
);
Posso confrontare genericamente il vecchio e il nuovo valore di un campo per rilevare se è cambiato o no?
È solo impossibile?
_field_invoke()
qualcosa o qualcosa di simile per preparare la struttura di campo completa dal nodo "preparato", renderizzare entrambi i campi e semplicemente confrontare queste stringhe HTML. Solo un'idea