Я додаю певні поля з типу вмісту у власну форму за допомогою field_attach_form (). Після надсилання форми я обробляю ці поля, зателефонувавши field_attach_form_validate () та field_attach_submit () з #validate та #submit callback.
У цей момент я хочу порівняти підготовлений об'єкт після подання, який готується до вихідного вузла, і потурбувати його лише для node_save (), якщо будь-яке з полів змінилося. Тому я починаю з завантаження вихідного вузла за допомогою entity_load_unchanged()
.
На жаль, польові масиви в початковому об'єкті вузла не відповідають польовим масивам у підготовленому об'єкті вузла, який чекає збереження, навіть якщо в полях не було внесено жодних змін, тому простий "$ old_field == $ new_field "порівняння неможливе. Наприклад, просте текстове поле з'являється таким чином в оригіналі:
$old_node->field_text['und'][0] = array(
'value' => 'Test',
'format' => NULL,
'safe_value' => 'Test',
);
Тоді як у підготовленому вузлі це виглядає так.
$node->field_text['und'][0] = array(
'value' => 'Test',
);
Ви можете подумати просто порівняти ключ "значення", але тоді ви натрапите на поля, що складаються з інших елементів, у яких немає клавіш "значення". Наприклад, давайте подивимось на адресне поле, де немає клавіші 'value', а в старих та підготовлених вузлах є ключі, які не мають аналогів.
Старий вузол
$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,
);
Підготовлений вузол
$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',
);
Для порожніх полів є ще одна невідповідність.
Старий вузол
$old_node->field_text = array();
Підготовлений вузол
$node->field_text = array(
'und' => array(),
);
Чи можу я порівняти старе та нове значення будь-якого поля, щоб визначити, змінилось воно чи ні?
Це просто неможливість?
_field_invoke()
чимось пов’язаним з цим, щоб підготувати повну структуру поля з "підготовленого" вузла, вивести обидва поля та просто порівняти ці рядки HTML. Просто ідея.