实体元数据包装器

时间:2014-09-19 12:51:28

标签: php drupal-7 entity

我的元数据包装器出错了。 我有一个现场测试=>实体引用多个,它是一个选择列表。我得到以下错误EntityMetadataWrapperException:给出无效的数据值。确保它符合所需的数据类型和格式。

$account = entity_load_single('user', $user->uid);
  $acc_wrapper = entity_metadata_wrapper('user', $account);
  $list = $acc_wrapper->test->value();
  $exists = FALSE;
  if (!empty($list)) {
    foreach ($list as $item) {
      if ($item->nid == $form_state['storage']['node']->nid) {
        $exists = TRUE;
        break;
      }
    }
  }
  if (!$exists) {
    if (!$list) {
      $list = array();
      $list[] = $form_state['storage']['node']->nid;
    }

$acc_wrapper->test->set($list);
$acc_wrapper->save();

1 个答案:

答案 0 :(得分:0)

第一个快速提示

$account = entity_load_single('user', $user->uid);
$acc_wrapper = entity_metadata_wrapper('user', $account);

除非您需要加载实体(或者已加载),否则无需加载实体。您只需要id,并让entity_metadata_wrapper魔术运行。

$acc_wrapper = entity_metadata_wrapper('user', $user->uid);

我认为你的错误就在这里

if (!$list) {
  $list = array();
  $list[] = $form_state['storage']['node']->nid;
}

$ list总是因为“$ list = $ acc_wrapper-> test-> value();”而启动,所以你永远不会满足条件,然后你试图将它设置回来并保存它(因为你错过了一个'}')......没有任何意义......

可以试试这个版本吗?

$acc_wrapper = entity_metadata_wrapper('user', $user->uid);
$list = $acc_wrapper->test->value();
$exists = FALSE;

if (!empty($list)) {
  foreach ($list as $item) {
    if ($item->nid == $form_state['storage']['node']->nid) {
      $exists = TRUE;
      break;
    }
  }
}
if (!$exists && !$list) {
    $list = array($form_state['storage']['node']->nid);

    $acc_wrapper->test = $list;
    $acc_wrapper->save();
}