Estou adicionando certos campos de um tipo de conteúdo a um formulário personalizado usando field_attach_form (). Quando o formulário é enviado, estou processando esses campos chamando field_attach_form_validate () e field_attach_submit () de #validate e #submit retornos de chamada.
Nesse ponto, desejo comparar o objeto de nó preparado pós-envio com o nó original e me preocupar apenas com node_save () se algum dos campos tiver sido alterado. Portanto, começo carregando o nó original usando entity_load_unchanged()
.
Infelizmente, as matrizes de campo no objeto de nó original não correspondem às matrizes de campo no objeto de nó preparado que está aguardando para ser salvo, mesmo que nenhuma alteração tenha sido feita nos campos, portanto, um simples "$ old_field == $ new_field "comparação é impossível. Por exemplo, um campo de texto simples aparece assim no original:
$old_node->field_text['und'][0] = array(
'value' => 'Test',
'format' => NULL,
'safe_value' => 'Test',
);
Enquanto no nó preparado aparece assim.
$node->field_text['und'][0] = array(
'value' => 'Test',
);
Você pode apenas comparar a chave 'value', mas depois encontra campos compostos de outros elementos que não possuem chaves 'value'. Por exemplo, vejamos um campo de endereço em que não há chave de 'valor' e há chaves nos nós antigos e preparados que não possuem contrapartes.
Nó antigo
$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,
);
Nó 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 campos vazios, há outra discrepância.
Nó antigo
$old_node->field_text = array();
Nó preparado
$node->field_text = array(
'und' => array(),
);
Posso comparar genericamente o valor antigo e o novo de qualquer campo para detectar se ele foi alterado ou não?
Isso é apenas uma impossibilidade?
_field_invoke()
ou algo relacionado para preparar a estrutura de campo completa do nó "preparado", renderizar os dois campos e simplesmente comparar essas seqüências de caracteres HTML. Apenas uma ideia.