Search code examples
phpdrupal-7entity

Entity metadata wrapper


i'm getting error with metadata wrapper. i have a field test => entity reference multiple which is a selection list.I get the following Error EntityMetadataWrapperException : Invalid data value given. Be sure it matches the required data type and format.

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

Solution

  • 1rst quick tips

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

    You don't need to load the entity unless you need it loaded after (Or it's already loaded). All you need is the id, and let entity_metadata_wrapper magic operate.

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

    I think your error is here

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

    $list is always initiated because of "$list = $acc_wrapper->test->value();", so you never fullfill the condition, and then you are trying to set it back and save it (because you are missing a '}' )... Makes no sense...

    Could try this version ?

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