Dodam pewne pola z typu zawartości do formularza niestandardowego za pomocą field_attach_form (). Kiedy formularz jest przesyłany, przetwarzam te pola, wywołując field_attach_form_validate () i field_attach_submit () z # callidvalidate i #submit.
W tym momencie chcę porównać obiekt po przesłaniu, przygotowany obiekt węzła z pierwotnym węzłem i zawracać sobie głowę węzłem_save (), jeśli którekolwiek z pól uległo zmianie. Dlatego zaczynam od załadowania oryginalnego węzła za pomocą entity_load_unchanged()
.
Niestety tablice pól w oryginalnym obiekcie węzła nie pasują do tablic pól w przygotowanym obiekcie węzła, który czeka na zapisanie, nawet jeśli nie wprowadzono żadnych zmian w polach, więc proste „$ old_field == $ new_field „porównanie jest niemożliwe. Na przykład proste pole tekstowe wygląda tak jak w oryginale:
$old_node->field_text['und'][0] = array(
'value' => 'Test',
'format' => NULL,
'safe_value' => 'Test',
);
Natomiast w przygotowanym węźle wygląda to tak.
$node->field_text['und'][0] = array(
'value' => 'Test',
);
Możesz po prostu porównać klucz „wartość”, ale potem natrafisz na pola złożone z innych elementów, które nie mają kluczy „wartość”. Na przykład spójrzmy na pole adresu, w którym nie ma klucza „wartość” i są klucze zarówno w starym, jak i przygotowanym węźle, które nie mają odpowiedników.
Stary węzeł
$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,
);
Przygotowany węzeł
$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',
);
W przypadku pustych pól istnieje jeszcze jedna rozbieżność.
Stary węzeł
$old_node->field_text = array();
Przygotowany węzeł
$node->field_text = array(
'und' => array(),
);
Czy mogę ogólnie porównać starą i nową wartość dowolnego pola w celu wykrycia, czy uległo ono zmianie?
Czy to tylko niemożliwość?
_field_invoke()
czymś związanym z przygotowaniem pełnej struktury pola z „przygotowanego” węzła, renderować oba pola i po prostu porównać te ciągi HTML. Po prostu pomysł.