Entity API模块,还提供了一个元数据封装器函数,entity_metadata_wrapper,通过这个函数的封装,我们可以更加方便的访问实体及其属性。这个函数给我们带来了哪些便利呢?我们通过代码示例来了解一下。
比如,获取节点作者的电子邮件地址,可以使用下面的代码:
$wrapper = entity_metadata_wrapper('node', $node);
$wrapper->author->mail->value();
我们在这里看到,封装过后的这个对象,在它上面,可以采用链式调用,此外它能够直接的建立关联关系。对于上面的功能,如果不使用封装器的话,我们通常采用这样的代码:
$uid = $node->uid;
$user = user_load($uid);
$mail = $user->mail;
这里,我们的代码也并不复杂,看不出来entity_metadata_wrapper的优越性。据文档里面说,$wrapper->author->mail->value();这段代码,可以省去user_load这个操作,直接通过关联关系获取到用户的电子邮件地址,这样可能会有一点小的性能提升。但是这也是有代价的,代价就是调用了entity_metadata_wrapper。通过这个例子,我们可以看到这个函数的基本用法。我们在前面让大家阅读代码的原因,就是为这里做准备的,为什么用的是$wrapper->author?而没有用$wrapper->uid,也没有用$wrapper->user?因为在hook_entity_property_info里面定义的是author。
为了更新用户的电子邮件地址,我们可以使用下面的代码:
$wrapper->author->mail->set('test@test.com');
或者
$wrapper->author->mail = 'test@test.com';
换成我们熟悉的代码,则是:
$user->mail = 'test@test.com';
user_save($user);
为了获取电子邮件的属性信息,可以使用下面的代码:
$mail_info = $wrapper->author->mail->info();
获取过滤了的节点标题:
$wrapper->title->value(array('sanitize' => TRUE));
获取原始数据:
$wrapper->body->value->raw();
上面的这几个例子都比较简单,我们看一个复杂的:
$wrapper->author->profile->field_name->value();
$wrapper->author->profile->field_name->set('新名字');
在这里,从节点,到节点的作者,再到作者的profile,再到profile上面的字段field_name,上面的一句,用来获取field_name字段的值,下面一句用来为该字段设置一个新值。如果我们自己写代码的话,需要加载用户对象,需要加载profile2对象,访问一个字段的值时,需要知道使用哪个语言来访问,代码写起来就比较复杂了。但是,在这里,一行代码就搞定了,非常方便。最后,我们再多看几个示例用法:
$wrapper->language('de')->body->summary->value();
$wrapper->author->mail->access('edit') ? TRUE : FALSE;
$wrapper->author->roles->optionsList();
$wrapper->field_files[0]->description = 'The first file';
$wrapper->save();
$node = $wrapper->value();