Desarrollo en Drupal más limpio: EntityMetadataWrapper

diseno.jpg
Solucionex
05
Feb 16

Desde hace ya algún tiempo, a la hora de desarrollar código o hacer 'theming' para Drupal, nos acostumbramos a utilizar los campos y sus arrays para obtener o modificar sus valores. Por ejemplo:

$value = $node->field_mydata[LANGUAGE_NONE][0]['value']

Esta práctica resulta engorrosa, a la vez que nos generaba problemas como la gestión del multidioma, la gestión de campos complejos (como link), colecciones de campos, etc..

Existe un modo más limpio de manejar los campos: utilizando la API del módulo Entity. El módulo Entity provee de un 'EntityMetadataWrapper' que simplifica el acceso y la gestión de los datos de los campos de las entidades en Drupal.

Veamos algunos ejemplos de uso:

Para empezar, obtenemos el objeto de un nodo, por ejemplo: 

$wrapper = entity_metadata_wrapper('node', $node);

Para ver los métodos que nos ofrece el wrapper, utilizamos dsm($wrapper->getPropertyInfo());

Para obtener el valor de un campo simple:
ANTES: $node->field_number[LANGUAGE_NONE][0]['value']
AHORA: $wrapper->field_number->value();

Campo de texto largo:
$wrapper->body->value(); // Array con: value, safe_value, format, and opcionalmente summary + safe_summary.
$wrapper->body->value->value(); // Valor filtrado.
$wrapper->body->value->raw(); // Valor sin filtrar.
$wrapper->body->format->value();

Campo enlace:
$wrapper->field_my_link->value(); // Array of: url, title, attributes.
$wrapper->field_my_link->url->value(); // Hyperlink destination.
$wrapper->field_my_link->title->value(); // Hyperlink text.
$wrapper->field_my_link->attributes->value(); // Array of: target, title, etc.
$wrapper->field_my_link->url = 'http://solucionex.com';
$wrapper->field_my_link->title = 'Do Drupal Right';

Campos múltiples:
$items = $wrapper->field_items->getIterator();
foreach($items as $item_wrapper):
$item_wrapper->field_item1->value();
...
endforeach;

Esto es sólo una muestra de todo lo que nos puede ofrecer la API.

Podéis obtener más información en https://www.drupal.org/documentation/entity-metadata-wrappers