Skip to content

Instantly share code, notes, and snippets.

@cesarmiquel
Last active September 15, 2017 20:16
Show Gist options
  • Save cesarmiquel/6d01a78b756c81f8669d to your computer and use it in GitHub Desktop.
Save cesarmiquel/6d01a78b756c81f8669d to your computer and use it in GitHub Desktop.
Entity Metadata Wrapper API examples

Entidades en Drupal 7

En Drupal 7 se 'mergearon' los usuarios, nodos y taxonomías en una entidad. Las entidades pueden tener campos adicionales a los que ya tenían. Adicionalmente, cada campo puede estar traducido y, por lo tanto, tener distintos valores dependiendo del idioma. En general es mejor acceder a los valores de los campos via APIs en lugar de acceder directamente al campo. Listamos algunas de las funciones más útiles y recomendadas para utilizar:

  • entity_load() - permite cargar una entidad. Los tipos de las entidades pueden ser 'node', 'user', etc. Ver: entity_load()
  • field_get_items() - devuelve, dada una entidad y el nombre de un campo la lista de valores que contiene el campo. Ver: field_get_values()
  • field_view_value() - devuelve un array rendereable con el valor. Para obtener HTML hacer drupal_render() a lo devuelto por esa función. Ver: field_view_value()

Estas funciones reciben parámetros para especificar el idioma, etc.

Adicionalmente hay una layer de abstracción que simplifica el acceso a entidades.

Ejemplos de uso: entity API

Algunos ejemplos:

<?php

  $blog_article = entity_metadata_wrapper('node', $node);
  
  // extract title
  $val = $blog_article->title->value();

  // body
  $summary     = $blog_article->body->summary->value();
  $body        = $blog_article->body->value();
  $body_format = $blog_article->body->format->value();

  // value (pre-procesados) de un field:
  $val = $blog_article->field_[FIELD_NAME]->value->value();

  // value crudo (sin procesar) de un field
  $val = $blog_article->field_[FIELD_NAME]->value->raw();

  // for the image URL. TODO: debe haber algo mejor. Esto anda.
  $img = $blog_article->field_[IMAGE_FIELD_NAME]->value();
  $image_url = file_create_url( $img['uri'] );
  $thumbnail_url = image_style_url( 'thumbnail', $img['uri'] );

  // Un term reference
  $term = $blog_article->field_[FIELD_NAME];
  if (!empty($term->value())) { 
    $tid  = $term->tid->value();
    $name = $term->name->value();
  }

  // Un node reference
  $node = $blog_article->field_node_reference->value();
  $node_wrapper = entity_metadata_wrapper('node', $node);

  // Para acceder a los fields de un term de una taxonomia:
  $term_wrapper = entity_metadata_wrapper('taxonomy_term', $term);
  $val = $term_wrapper->field_[FIELD_NAME]->value();

  // Para acceder a una lista de files
  $attachments = $blog_article->field_attachment;
  foreach($attachments as $attachment) {
    // Description typed when uploading de file
    $description = $attachment->description->value();
    // File object
    // $attachment_data es un StdClass con las siguientes properties:
    //   $attachment_data->filename
    //   $attachment_data->uri
    //   $attachment_data->filesize
    //   $attachment_data->filemime
    $attachment_data = $attachment->file->value();
  }

Más ejemplos de esta página http://drupal.org/node/1021556:

<?php

 $wrapper->author = 0;
 $wrapper->url = 'dummy';
 $wrapper->author->mail = 'foo';
 $wrapper->author = NULL;
 $wrapper->author->set($GLOBALS['user']->uid);
 $wrapper->author->set($GLOBALS['user']);
 $wrapper->body->set(array('value' => "<b>The second body.</b>"));
 $wrapper->language('de');
 $wrapper->body->set(array('value' => "<b>Der zweite Text.</b>"));
 $wrapper->language(LANGUAGE_NONE);
 $wrapper->set($node);
 $wrapper->reference->name->set('foo');
 $wrapper->reference->set($wrapper);
 $wrapper->save();
 $wrapper->delete();
 $wrapper->type->set('article');
 $wrapper->author = $user->uid;
 $wrapper->{$property}[0] = '2009-10-05';
 $wrapper->field_image = array('fid' => $file->fid);
 $wrapper->$name->value();
 $wrapper->parent[] = $term_parent2;
 $wrapper->field_tags[1] = $term_parent;
 $wrapper->field_tags->set(array(2));
 $wrapper->field_tags = NULL;
 $wrapper->$field_name->set(NULL);
 $wrapper->field_text[0] = 'the text';
 $wrapper->field_text[0]->set(array('value' => "<b>The second body.</b>"));
 $wrapper->field_text2->summary = 'the summary';
 $wrapper->field_text2->value = 'the text';
 $wrapper->field_file[0] = array('fid' => $file->fid, 'display' => FALSE);
 $wrapper->field_file[0]->description = 'foo';
 $wrapper->field_file[0]->display = TRUE;
 $wrapper->field_file[1]->file = $file;
 $wrapper->field_file[] = array('description' => 'test');
 $wrapper->field_file = NULL;
 $wrapper->field_image = array('fid' => $file->fid);
 $wrapper->field_image->alt = 'foo';
 $wrapper->field_image->file = $file;
 $wrapper->field_image = array();

Otro ejemplo de código de Lean:

<?php

function THEME_preprocess_node(&$vars) {

  $blog_article = entity_metadata_wrapper('node', $vars['node']);

  $blogger = entity_metadata_wrapper('node', $blog_article->field_blogger->value());

  $blog_type = $blog_article->field_blog_type->value();

  // .
  // .

  $vars['blogger_link'] = url('node/'.$blogger->nid->value());
  $vars['blogger_portrait'] = field_view_field('node', $blog_article->field_blogger->value(), 'field_blogger_portrait');
  $vars['blogger_title'] = $blogger->title->value();
  $vars['blogger_position'] = $blogger->field_position->value();
  $vars['blogger_contact_info'] = $blogger->field_contact_info->value->value();
}      

Ejemplo de como modificar un usuario

<?php

  // entity wrapper para el usuario
  $user_wrapper = entity_metadata_wrapper('user', $user);
  $roles = array();
  foreach(array('rol 1', 'rol 2') as $role_name) {
    role = user_role_load_by_name($role_name);
    if ($role) {
      $roles[] = $role->rid;	
    } else {
      watchdog('php', 'Cannot find role: %role' , array('%role' => $role_name), WATCHDOG_ERROR);
    }
  }

  // asignar roles
  $user_wrapper->roles = $roles;

  // guardar la entidad
  $user_wrapper->save();

Ejemplos de uso: API 'nativa' Drupal

<?php

  $u = array_pop(entity_load('user', array($user->uid)));
  $user_slots = field_get_items('user', $u, 'field_total_slots');

eso devuelve:

Array
(
    [0] => Array
        (
            [value] => 4
        )

)

Un ejemplo simliar:

<?php

  // Buscar el usuario cuyo ID es 57
  $u = array_pop( entity_load('user', array(57)) );
   
  // Traer los valores del campo 'field_member_name'
  $items =  field_get_items('user', $u, 'field_member_name');
  
  // Generar un array con el primer item
  $value = field_view_value('user', $u, 'field_member_name', $items[0]);

  // Generar HTML a partir del 'array markup'
  $html = drupal_render($value);

  echo "Output de field_get_items():\n";
  print_r($items);
  
  echo "Output de field_view_value():\n";
  print_r($value);

  echo "Output de drupal_render():\n";
  print_r($html);  

Output:

Output de field_get_items():


Array
(
    [0] => Array
        (
            [value] => César Miquel
            [format] => 
            [safe_value] => César Miquel
        )

)

Output de field_view_value():
Array
(
    [#markup] => César Miquel
    [#access] => 1
    [#type] => markup
    [#pre_render] => Array
        (
            [0] => drupal_pre_render_markup
            [1] => ctools_dependent_pre_render
        )

    [#children] => César Miquel
    [#printed] => 1
)

Output de drupal_render():

Para Field_Collection

<?php

  $node = node_load(arg(1));
  $node_wrapper = entity_metadata_wrapper('node', $node);

  foreach ( $node_wrapper->field_related_content as $collapsible_field ) { 

    $collection_wrapper = entity_metadata_wrapper('field_collection_item', $collapsible_field);
    kpr($collection_wrapper->field_collapsible_box_title->value());

  }  
  • Esto no es necesariamente asi, se puede acceder normalmente mediante la notacion '->'.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment