EntityMetadataWrapperException:字段的未知数据属性

时间:2013-08-20 08:02:28

标签: php drupal drupal-7

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

$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 个答案:

答案 0 :(得分: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() : '';

答案 1 :(得分:5)

参考Clive的回答,你可以像这样使用__isset()

print ($wrapper->__isset('field_property_sample') ? $wrapper->field_property_sample->value() : '';

答案 2 :(得分: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
    }
  }

答案 3 :(得分:1)

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

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

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

所以使用:

$wrapper->field_property_sample->value();

是正确的语法。

要正确使用Entity元数据包装器,请检查:Entity metadata wrappers page。

以下是一些代码示例:

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());
来自Devel模块的

dpm()dd()