entity_metadata_wrapper()函数的作用是什么,为什么要使用它?


23

目前,我似乎正在为许多使用Entity API的模块开发附加组件,并且该entity_metadata_wrapper()功能不断弹出。

文档页面表示,这一下吧:

返回给定数据的属性包装器。

如果包装了实体,则可以使用包装器为实体属性检索其他包装器。

忽略其中的“实体”一词的弗洛伊德奇妙的拼写,我真的不明白这些包装的目的是什么。

我知道该函数实质上返回一个EntityDrupalWrapper类:

包装器简化了实体属性的getter和setter回调的应用

但是我不明白的是它如何使事情变得更容易。

例如,要更新节点的状态属性,可以使用以下代码:

$node = node_load($nid);
$node->status = 1;
node_save($node);

很干净 据我了解(但可能是错误的),使用的等效代码entity_metadata_wrapper()会比这更冗长。

我不确定在这里是否仅仅是因为使用了“包装器”这个词,但是我也仔细查看了Entity模块中的代码,并且我真的不太了解它。

有谁能够解释使用此功能的好处,并可能为常见用例提供一个简单的代码示例?


这可能会加深对实体api和包装器的了解。这是实体人Fago的演讲。wolfgangziegler.net/drupalcon-denver
肯·

谢谢,这听起来很开场。我给它一看时,我有一段时间了
克莱夫

该“视频已从blip中删除”,但幻灯片仍在下载中。
artfulrobot

Answers:


23

是的,更改节点的状态很简单,因为这是硬编码的属性。

另一方面,字段要复杂得多。它们嵌套在三个级别的深处,虽然有field_get_items()可以使用正确的语言来获取它们,但没有用于设置字段值的此类功能。因此,您始终需要检查字段是否可翻译,并且需要知道哪个属性正好包含您要查找/想要设置的值。

两个示例显示了实体包装器可以做什么:

  • 以下行将商业行项目添加到订单中,照顾到语言和包含引用ID的实际属性,该属性取自以下答案/drupal//a/23513/31

    $order_wrapper->commerce_line_items[] = $line_item;
  • 以类似的方式,能够直接访问字段的值,而无需检查语言或增量,甚至能够直接访问从/drupal//a/获取的引用实体33010/31

    $subnode = entity_metadata_wrapper('node', $node)->field_subnode->value();
    $default = $subnode->title;

实体包装器是诸如Search APIRules之类的灵活,功能强大的模块背后的推动力,因为它允许它们通过多个级别的引用进行工作,因此您可以例如访问用户在某项订单中购买的产品领域这样[commerce-order:commerce-line-items:0:commerce-product:some-field](实际上可能不是正确的,但类似的东西),或者将被引用节点的主体摘要添加到您的搜索索引中。

就是说,我不必喜欢包装器的实际API,它是巨大的内部数组,甚至简单的属性也都是包装器类。我希望Drupal 8中改进的实体(并希望是现场)系统将由于对实体进行分类而消除了对此类包装的需求。


太棒了,我知道我只是错过了一些东西。我认为正是EntityDrupalWrapper引起了混淆的描述;当它提到“属性”时,我根本没有意识到涉及字段,我只是以为这实际上意味着该类负责处理属性(nid,status等)。感谢您的澄清,知道Rules模块将其用于数据选择器使它变得更加有意义
Clive

@Berdir“我不一定非要喜欢包装程序的实际API ...”我和您有相同的感受。您对此有何打击?您是否使用field_view_value()查看值?您如何建议在自定义回调中为自定义工作流或仪表板设置值?
Charlie Schliesser 2012年
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.