在保存节点之前,通常以自定义形式检测更改的字段
我正在使用field_attach_form()将内容类型中的某些字段添加到自定义表单中。提交表单后,我正在通过#validate和#submit回调调用field_attach_form_validate()和field_attach_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', ); 您可能会想只比较“值”键,但随后会遇到由没有“值”键的其他元素组成的字段。例如,让我们看一个地址字段,其中没有“值”键,在旧节点和准备好的节点中都没有对应的键。 旧节点 $old_node->field_address['und'][0] = array( 'country' => 'GB', 'administrative_area' => 'Test', 'sub_administrative_area' => NULL, 'locality' => 'Test', 'dependent_locality' => NULL, 'postal_code' …