使用该语言时的最佳实践是什么?


51

我开始使用此表单来访问模块中的数据。(请参阅注释1。

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

我认为这看起来像是一个很好的解决方案,但在同样的问题下,我发现了这一点

不要假定“ und”用于没有语言的实体的字段,它也适用于不可翻译的字段,并且没有实体翻译模块的所有字段。此外,Drupal的各种7.x版本之间的区别也有所不同。
最好使用该field_get_items()功能,该功能将以哪种语言代码为您存储数据。

现在我不知道我正在使用的东西是否可以打破常规。

Answers:


39

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

此功能是否已entity_metadata_wrapper()被弃用?我尝试在模块中调用它,然后得到了Fatal error: Call to undefined function entity_metadata_wrapper()-我也在Dreamweaver中的Drupal 7.12安装上进行了源搜索,并在代码中的其他任何地方得出了0个结果!
Aditya MP

1
aditya-在Entity API模块中-不在核心中。
lazysoundsystem

1
@adityamenon就像懒惰的人说的那样,这并不是核心问题……但是,它可能适用于Drupal8。实体API至少将得到极大的改进。确实没有时间为Drupal 7创建实体系统所需的所有API,所以这就是实体API模块想要实现的目标。
googletorp

谢谢大家,我很愚蠢,没有正确地阅读答案,而是通过链接访问Entity API项目页面:)
Aditya MP

1
当我查看entity_metadata_wrapper的源代码并按照兔子的足迹浏览所有实例化和扩展的类,以使我更容易进行字段操作时,我想知道是否值得这样做。在我的引导程序中添加另外3k +行代码,并占用更多的内存来处理所有变量分配...还有什么更轻量的?看来这$node->field_name[LANGUAGE_NONE][0]['value'] = 'foo';确实是最有效的方法。
查理·史利瑟

19

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

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

因此,是的,实体API模块确实提供了更好的API,但缺点是它还带来了很多开销(它基本上将每个值转换为包装对象,该包装对象具有大量嵌套的属性信息数组)。尝试转储实体包装程序通常将使您一无所获,或者一堆无法读取的数组。


1
从您所说的内容中我得到的印象是,在Drupal 8中可以改善这种情况吗?如果是这样,如何去发现这些事情的进展情况?除了模块页面外,Do对我而言就像是一个迷宫!:)
Clive

1
好吧,总有希望:)而且很难对Drupal 8中发生的事情有一个高水平的概述,一种方法是遵循最初的想法。但是,这不是现有指令的直接目标。实体API模块的一部分已移动/正移动到核心中(现在有Entity类,现有实体已转换为新系统)。因此,我们有机会例如直接在这些类上获取方法来处理字段。对于已提交的更改,好的资源是新的更改记录系统,请参阅drupal.org/list-changes/drupal
Berdir 2012年

太棒了,这正是我一直在寻找感谢的那种东西!:)希望您不要介意我的问题,我知道这不是该站点真正的话题...我很乐意参与对核心的贡献,但从未真正参与过开源,我发现了整件事有点令人生畏...很高兴有个不错的起点:)
克莱夫(Clive)

Clive:请访问drupalofficehours.org-正是为了帮助人们开始做贡献。那里有更多资源。我还建议参加一个用户小组会议,让核心开发人员经常参加或者更可能是DrupalCamp,一个或两个核心开发人员将参加。在groups.drupal.org上找到您的本地组,您应该可以解决它。drupical.org也可能有用。
wizonesolutions 2012年

-2
$node = node_load($lot_id);
$field_language = field_language('node', $node, 'field_name');
$node->field_name[$field_language][0]['value'] = $custom_value;

您能否添加简短说明,以解释为什么会回答这个问题?
2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.