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. 你的生活质量代码质量同步上升。。

Avatar
崔秀龙

简单,是大师的责任;我们凡夫俗子,能做到清楚就很不容易了。

comments powered by Disqus
下一页
上一页

相关