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分钟来完成下面的事情:
下载Entity API。
你的生活质量代码质量同步上升。。