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