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.
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();
}
<?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();
<?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():
<?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 '->'.