Я добавляю определенные поля из типа контента в пользовательскую форму, используя field_attach_form (). Когда форма отправлена, я обрабатываю эти поля, вызывая field_attach_form_validate () и field_attach_submit () из обратных вызовов #validate и #submit.
В этот момент я хочу сравнить подготовленный объект узла после отправки с исходным узлом и беспокоиться об этом только для 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. Просто идея.