当前位置: 首页>>建站开发>>正文


使用语言[und]时最佳做法是什么?

webfans 建站开发 , 去评论

问题描述

我开始使用此表单访问模块中的数据。 (参见comment #1。)

$node->field_test[$node->language][0]['value']

我认为这看起来是一个非常好的解决方案,但在同样的问题中我找到了this

Don’t assume that ‘und’ is for fields of entities without language, it is also for fields that are not translatable, and without the entity translation module that is all fields. Moreover, there are differences in this between the various 7.x versions of Drupal.
Better to use the field_get_items() function which will sort out for you under what language code the data is stored.

而现在我不知道我使用的是什么可以打破一些事情。

最佳解决方案

我发现使用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';
}

或者您可以使用EntityMetadataWrapper内部处理的isset()

$field_val = 'default/fallback value';
if (isset($node_wrapper->field_doesnt_exist)) {
  $field_val = $node_wrapper->field_doesnt_exist->value();
}

次佳解决方案

对于阅读,您应始终能够使用field_get_items(),它将为您选择正确的语言,并检查该字段是否有任何值。

不幸的是,字段API在7.x中非常有限,没有办法获得例如第一个字段项,甚至不敢询问有关通过单个函数调用获取值…并且没有 field_set_items()对应。

所以是的,实体API模块确实提供了一个更好的API,其缺点是它还带来了相当多的开销(它基本上将每个值转换为包含大量嵌套属性信息数组的包装器对象)。尝试转储实体包装器通常会让您无法获得任何内容或一系列不可读的数组。

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2706.html,转载请务必附带本地址声明。