我正在使用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' => '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字符串,或者进行一些相关的工作。只是一个主意。