5

我最近一直在尝试更新我的代码以使用实体包装器来访问字段值。现在我有这个:

$wrapper = entity_metadata_wrapper("node", $nid);
print($wrapper->field_property_sample()->value());

而不是这个:

print($node->field_property_sample[LANGUAGE_NONE][0]["value"]);

问题是有时我会遇到这个:

EntityMetadataWrapperException:未知数据属性 field_property_sample。

我有办法解决这个问题吗?

我有大约 10 个这样的字段可以抛出这个异常,而且它真的越来越难看

$wrapper = entity_metadata_wrapper("node", $nid);

try {
  print($wrapper->field_property_sample()->value());
} catch (EntityMetadataWrapperException &e){
  print("");
}

/** repeat 10 times **/

是否有一些我可以或多或少这样调用的功能?

$wrapper = entity_metadata_wrapper("node", $nid);
print($wrapper->field_property_sample->exists() ? $wrapper->field_property_sample->value()  : "" );

/** repeat 10 times **/
4

4 回答 4

8

是的,您可以只使用 PHP 语言的现有功能

try {
  print($wrapper->field_property_sample->value());
}
catch (EntityMetadataWrapperException $e) {
  // Recover
}

或者,由于EntityMetadataWrapper实现__isset()了您可以使用它:

print isset($wrapper->field_property_sample) ? $wrapper->field_property_sample->value() : '';
于 2013-08-20T08:54:40.110 回答
5

参考克莱夫的回答,你可以__isset()这样使用:

print ($wrapper->__isset('field_property_sample') ? $wrapper->field_property_sample->value() : '';
于 2013-10-10T15:11:21.290 回答
2

在嵌套字段集合上:

在遍历字段集合列表并检查嵌套在第一个字段集合中的非空字段集合时,isset() 不起作用。但是,我发现检查:

  foreach ($node_wrapper->field_fc_one AS $field_collection) {

    // Grab a nested field collection, properly wrapped.
    $nested_fc_wrapper = $field_collection->field_nested_fc;

    // isset() or $wrapper->__isset('') do not work here, but this does:
    if(nested_fc_wrapper->getIdentifier()) {

      // Do some stuff
    }
  }
于 2014-07-01T16:01:30.430 回答
1

使用field_property_sample()没有意义,因为:

  • $wrapper->field_property_sample()用于调用类方法
  • $wrapper->field_property_sample用于获取类属性的值

属性是你要使用的变量,类方法是你要调用的函数。

所以使用:

$wrapper->field_property_sample->value();

是正确的语法。

要正确使用实体元数据包装器,请查看:实体元数据包装器页面。

这是一些代码示例:

try {
  $wrapper = entity_metadata_wrapper('node', $node);
  $wrapper->field_property_sample = 'some data';
  $wrapper->field_multi_sample = array('1st', '2nd');
  $wrapper->save();
}
catch (EntityMetadataWrapperException $e) {
  watchdog_exception('my_module', $e);
}

要打印,请使用:

print($wrapper->field_property_sample->value());

或者dpm()dd()来自开发模块。

于 2016-05-31T15:51:07.970 回答