欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

我们可以 $node->引用节点nid 再使用 node_load($node->引用节点ni) 请问 $node对象 可以 直接获得 引用的对象 吗?

shiping1 的头像
我们可以 $node->引用节点nid 再使用 node_load($node->引用节点ni)
请问  $node对象 可以 直接获得 引用的对象 吗?
【入门】广西-丞辰(510912780)  14:23:06
自己试试不就清楚了吗?
【高级】[北京]流云(879078689)  14:24:03
不能
你可以用 entity_metadata_wrapper
【进阶】[苏州]泪痕_元怜(958186957)  14:24:23



entity_metadata_wrapper极简说明

你熟悉entity_metadata_wrapper么?如果不熟悉,那么赶快补课吧。

Entity Metadata Wrapper(实体元数据封装),在模块开发过程中对Field的操作来说,是最正确,也是最简单的方式。没错,在CCK年代,我们对Node中Field的操作熟练无比,不过现在看来,那些代码真的很邋遢。

干净的代码!

以前是:

<?php
$first_name = '';
if (!empty($node->field_first_name)) {
  $name = $node->field_first_name[LANGUAGE_NONE][0]['value'];
}
?>

现在可以把它浓缩成这样:

<?php
$node_wrapper = entity_metadata_wrapper('node', $node);
$first_name = $node_wrapper->field_first_name->value();
?>

entity_metadata_wrapper这个好长的单词有点点吓人,不过他的确让代码干净了。如果要处理一个实体引用字段,或者文件字段,只要这样子:

<?php
$image = $node_wrapper->field_image->value();
?>

引用字段在这里已经载入成为了对象,而不只是一个FID了。

实体引用的处理:比干净还干净!

假设你有两种Node类型:员工和部门。员工Node中有一个指向部门的实体引用字段,部门Node又一个叫做field_dept_phone的字段保存了部门的电话号码(为了行文方便,我们假设部门字段是必填的)。

如果拿到一个员工Node,如何取到电话号码呢?

高难度动作:

<?php
$phone = '';
$department = node_load($employee->field_employee_dept[LANGUAGE_NONE][0]
['target_id']);
if ($department && !empty($department->field_dept_phone[LANGUAGE_NONE][0]
['value'])) {
  $phone = $department->field_dept_phone[LANGUAGE_NONE][0]['value'];
}
?>

Wrapper的办法:

<?php
$wrapper = entity_metadata_wrapper('node', $employee);
$phone = $wrapper->field_employee_dept->field_dept_phone->value();
?>

然后?

嗯,这个帖子并不是想做一个完整的entity metadata wrapper教学。如果上面的描述吸引了你,请花15分钟来完成下面的事情:

  1. 下载Entity API

  2. 阅读Entity metadata wrappers

  3. 你的生活质量代码质量同步上升。。

来自  https://drupal.fleeto.us/translation/entity-metathing-what-very-brief-introduction-entitymetadatawra...
普通分类: