Answers:
我发现使用Entity API模块有很大的帮助,也使代码更具可读性。由于节点的语言和字段的语言可能不同,因此上面的代码并不总是有效。
通过实体API模块及其包装,您可以使用以下代码:
$node_wrapper = entity_metadata_wrapper('node', $node);
$field_val = $node_wrapper->field_test->value();
这应该是防弹的。使用实体模块的一件事是,如果您尝试访问不存在的字段,则会收到一个讨厌的错误并抛出异常,而不是发出通知和错误行为。
为了避免这种情况,您可以像这样尝试/捕获
try {
$field_val = $node_wrapper->field_doesnt_exist->value();
} catch (EntityMetadataWrapperException $e) {
$field_val = 'default/fallback value';
}
或者,您可以在内部使用isset()
哪个EntityMetadataWrapper
句柄:
$field_val = 'default/fallback value';
if (isset($node_wrapper->field_doesnt_exist)) {
$field_val = $node_wrapper->field_doesnt_exist->value();
}
$node->field_name[LANGUAGE_NONE][0]['value'] = 'foo';
确实是最有效的方法。
为了阅读,您应该始终能够使用field_get_items(),它将为您选择正确的语言,并检查该字段是否具有任何值。
不幸的是,字段API在7.x中非常受限制,无法获得例如第一个字段项,甚至不敢问通过单个函数调用获取值的问题……而且没有field_set_items( )对应。
因此,是的,实体API模块确实提供了更好的API,但缺点是它还带来了很多开销(它基本上将每个值转换为包装对象,该包装对象具有大量嵌套的属性信息数组)。尝试转储实体包装程序通常将使您一无所获,或者一堆无法读取的数组。
$node = node_load($lot_id);
$field_language = field_language('node', $node, 'field_name');
$node->field_name[$field_language][0]['value'] = $custom_value;
entity_metadata_wrapper()
被弃用?我尝试在模块中调用它,然后得到了Fatal error: Call to undefined function entity_metadata_wrapper()
-我也在Dreamweaver中的Drupal 7.12安装上进行了源搜索,并在代码中的其他任何地方得出了0个结果!