dashan 提交于
最近发现,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的代码
嗯,是封装的,所以估计这个代码的写法较特别
常用的就是
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/programatically-access-field-data-using-entitymetadatawrapper-drupal
http://www.pixelite.co.nz/article/how-use-entity-metadata-wrappers-drupal-7
(转摘浩江的文章做保存用,前段时间因为他的站点qiang打不开,找了好半个月才找到这个文章,收录转载一下)
- 登录以发表评论