You are here

6.2 entity_metadata_wrapper

admin 的头像
Submitted by admin on 星期五, 2015-08-28 09:26

作者:老葛,北京亚艾元软件有限责任公司,http://www.yaiyuan.com

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();


Drupal版本: