实体元数据包装器异常: 字段的未知数据属性

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个回答

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

这就是我正在做的事情,但当你有大约10个属性可能会抛出该异常时,代码会变得非常丑陋,非常快。 - ferd tomale
请查看更新后的答案,普通的 isset() 是最干净的方式。 - Clive
2
尝试了几次,即使使用isset()调用,仍然会抛出EntityMetadataWrapperException异常。还有更多的想法吗? - ferd tomale

5

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

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

2
最好使用 isset($wrapper->field_property_sample) 而不是直接访问魔术方法 __isset。如果以后 __isset 的实现方式发生了任何变化,调用 isset() 很可能仍然能够正常工作。 - donut

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
    }
  }

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

或者使用 Devel 模块中的 dpm()dd()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接