【问题标题】:EntityMetadataWrapperException: unknown data property for fieldEntityMetadataWrapperException:字段的未知数据属性
【发布时间】:2013-08-20 08:02:27
【问题描述】:

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

$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 **/

【问题讨论】:

    标签: php drupal drupal-7


    【解决方案1】:

    是的,您可以只使用 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 个可以引发该异常的属性时,代码会变得非常难看。
    • 查看更新后的答案,简单的旧 isset() 是最干净的方式。
    • 尝试了几次,即使使用 isset() 调用,它仍然抛出 EntityMetadataWrapperException。还有什么想法吗?
    【解决方案2】:

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

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

    【讨论】:

    • 使用isset($wrapper->field_property_sample) 可能比直接访问魔术方法__isset 更好。如果__isset 的实现方式发生任何变化,只需调用isset() 可能会继续以相同的方式工作。
    【解决方案3】:

    关于嵌套字段集合:

    在遍历字段集合列表并检查嵌套在第一个字段集合中的非空字段集合时,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
        }
      }
    

    【讨论】:

      【解决方案4】:

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

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

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

      所以使用:

      $wrapper->field_property_sample->value();
      

      是正确的语法。

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

      下面是一些代码示例:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-01-04
        相关资源
        最近更新 更多