entity_metadata_wrapper是drupal 7输入输出的利器

论坛: 

最近发现,entity_metadata_wrapper, 是drupal 7输入输出的利器,下文希望可以引导大家举一反三:

(在看该文前,最好先看看drupal anywher: node_load\node_save \ chdir,该文相当于node_load\node_save的升级方法)

特别是他的set方法(写方法)、save,我特别喜欢,性能大大提高了,node_save涉及了太多的性能问题。

而且你不需要再区分entity了,例如你不需要纠结user的时候用user_save,node的时候你要用node_save了,你目前只要记得一个:

$wrapper->save();

而且你不需要再找字段结构去修改了,你只要知道字段名就行了

既往(沿用D5\D6时代)的输入输出方式如:$node->field_seriesid[LANGUAGE_NONE][0]['value']实在有点麻烦

entity_metadata_wrapper可能是一个很好的解决办法。

先看看这个API的代码

http://drupalcontrib.org/api/drupal/contributions!entity!entity.module/function/entity_metadata_wrapper/7

嗯,是封装的,所以估计这个代码的写法较特别

有一堆的方法:http://drupalcontrib.org/api/drupal/contributions%21entity%21includes%21entity.wrapper.inc/class/EntityMetadataWrapper/7

常用的就是

value();最常用

raw(); 可能与上面的value()一致

set();最常用

save();!!!!神器!!!!

既然是封装,目的就是为了方便调用、循环、读写,我们下面重点了解一下读写,循环没多大变化

测试一下entity wrapper的读取(value方法或者raw方法都行,看你自己喜欢):

$node=node_load(74);//test only

$wrapper = entity_metadata_wrapper('node', $node);

print_r($wrapper->getPropertyInfo());

这个代码将这个node的所有内容都封装起来了

输出的是一堆字段,如下,比print_r($node)的方法的确要简洁多了

[field_images] => Array
 	(
 	[label] => 产品图片
 	[type] => list<field_item_image>
 	[description] => Field "field_images".
 	[getter callback] => entity_metadata_field_verbatim_get
 	[setter callback] => entity_metadata_field_verbatim_set
 	[access callback] => entity_metadata_field_access_callback
 	[translatable] =>
 	[field] => 1
 	[required] => 1
 	[auto creation] => entity_metadata_field_file_create_item
 	[validation callback] => entity_metadata_field_file_validate_item
 	[property info] => Array
 	(
 	[file] => Array
 	(
 	[type] => file
 	[label] => The image file.
 	[getter callback] => entity_metadata_field_file_get
 	[setter callback] => entity_metadata_field_file_set
 	[required] => 1
 	)

 	)

 	)

那我们如果要输出上述image的SRC要怎么办了,上面输出的是property,不是值,比较抽象

我们可以尝试一下wrapper最常用的方法,即$wrapper->某个字段名字->value()看看输出啥

即代码改为:

$node=node_load(74);//test only

$wrapper = entity_metadata_wrapper('node', $node);

//print_r($wrapper->getPropertyInfo());

$image = $wrapper->field_images->value();

print_r($image);

输出:

Array
 	(
 	[0] => Array
 	(
 	[fid] => 105
 	[uid] => 1
 	[filename] => 3248487_980x1200_0.jpg
 	[uri] => public://3248487_980x1200_0_0.jpg
 	[filemime] => image/jpeg
 	[filesize] => 58104
 	[status] => 1
 	[timestamp] => 1405521289
 	[alt] =>
 	[title] =>
 	[width] => 500
 	[height] => 675
 	)

 	[1] => Array
 	(
 	[fid] => 106
 	[uid] => 1
 	[filename] => d2a27bb9a6.jpg
 	[uri] => public://d2a27bb9a6_0.jpg
 	[filemime] => image/jpeg
 	[filesize] => 46986
 	[status] => 1
 	[timestamp] => 1405521289
 	[alt] =>
 	[title] =>
 	[width] => 456
 	[height] => 445
 	)

 	)

这样就很明了了,如果我要输出image src,代码改为下面的即可(或者写个foreach)

$node=node_load(74);//test only

$wrapper = entity_metadata_wrapper('node', $node);

//print_r($wrapper->getPropertyInfo());

$image = $wrapper->field_images->value();

//print_r($image);

print_r($image[1]['uri']);

下面测试一下写方法,即更改字段的值,你会爱上这办法的

你不需要再去记得

$wrapper->save();

我们来看看他修改title的情况

$node=node_load(74);//test only

$wrapper = entity_metadata_wrapper('node', $node);

//print_r($wrapper->getPropertyInfo());

$wrapper->title="try share and earn and entity wrapper";

$wrapper->save();

这个直接给值的办法相当于$wrapper->field_example_1->set($value);

不得不说,真是一个神一样的方法啊!

而且注意了,如果你用node_save的方法去改,因为D7有entity cache的原因,有些时候,某些字段会延时改动的

这个方法不会!!

当然,回到一开始的问题,我们要多语言修改,怎么办?

可以用下面的两个办法:

$wrapper = entity_metadata_wrapper('node', $node, aray('langcode' => 'en'));

$wrapper->language(‘de’)->body->summary->value();

举三反三才是王道:

上面用到的办法是node_load+entity_metadata_wrapper

那显然,到user的时候就是user_load+entity_metadata_wrapper

那到commerce呢?例如:commerce_cart_order_load($user->uid);

commerce可以参考下面两文,不在详细写了

https://snipt.net/TheodorosPloumis/drupal-commerce-rules-loop-through-commerce-line-items/

http://deeson-online.co.uk/labs/drupal-commerce-getting-price-product-nicely-formatted-string-programatically

 

下面两个参考文献写得相当好:

http://deeson-online.co.uk/labs/programatically-access-field-data-using-entitymetadatawrapper-drupal

http://www.pixelite.co.nz/article/how-use-entity-metadata-wrappers-drupal-7

 (转摘浩江的文章做保存用,前段时间因为他的站点qiang打不开,找了好半个月才找到这个文章,收录转载一下)