Estoy agregando ciertos campos de un tipo de contenido a un formulario personalizado usando field_attach_form (). Cuando se envía el formulario, estoy procesando esos campos llamando a field_attach_form_validate () y field_attach_submit () desde #validate y #submit callbacks.
En ese momento, quiero comparar el objeto de nodo preparado posterior al envío con el nodo original y solo molestarme en node_save () si alguno de los campos ha cambiado. Por lo tanto, empiezo cargando el nodo original usando entity_load_unchanged()
.
Desafortunadamente, las matrices de campo en el objeto de nodo original no coinciden con las matrices de campo en el objeto de nodo preparado que está esperando ser guardado, incluso si no se han realizado cambios en los campos, por lo que un simple "$ old_field == $ new_field "La comparación es imposible. Por ejemplo, un campo de texto simple aparece así en el original:
$old_node->field_text['und'][0] = array(
'value' => 'Test',
'format' => NULL,
'safe_value' => 'Test',
);
Mientras que en el nodo preparado aparece así.
$node->field_text['und'][0] = array(
'value' => 'Test',
);
Puede pensar en comparar la clave de "valor", pero luego se encuentra con campos formados por otros elementos que no tienen claves de "valor". Por ejemplo, veamos un campo de dirección donde no hay una clave de 'valor' y hay claves en los nodos antiguos y preparados que no tienen contrapartes.
Nodo antiguo
$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 preparado
$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',
);
Para los campos vacíos, hay otra discrepancia.
Nodo antiguo
$old_node->field_text = array();
Nodo preparado
$node->field_text = array(
'und' => array(),
);
¿Puedo comparar genéricamente el valor antiguo y el nuevo de cualquier campo para detectar si ha cambiado o no?
¿Es esto solo una imposibilidad?
_field_invoke()
o algo relacionado para preparar la estructura de campo completa del nodo "preparado", renderizar ambos campos y simplemente comparar estas cadenas HTML. Solo una idea.