Drupal acceso a campos ¿ un método seguro ?

Después de varios artículos realizando un viaje por las soluciones de personalización del diseño de Drupal, llegamos a un punto que creo es bastante crítico y nada trivial : como acceder a los campos de los nodos.

El contexto

Para entender bien la importancia de todo ésto, primero nos situaremos. Estamos ahora mismo en un archivo de template ".tpl.php", en uno de nodo (node.tpl.php) , ya sea el general o uno concreto (tipo / id). Aquí dentro, tenemos acceso a la variable $node, que tiene los datos del nodo y entre ellos los campos que queremos visualizar.

Los Campos

Primero de todo hemos de entender que estamos hablando de Drupal 7, en Drupal 6, los campos no formaban parte del core sino que eran un módulo aparte (CCK) y funcionaban ligeramente diferente. Todos los campos empiezan por "field_" , con lo que cuando hablemos del nombre del campo, este prefijo también forma parte del nombre, así pues si tenemos un campo de teléfono, el nombre será "field_telefono" (usaremos este nombre a partir de ahora para escenificar un campo). 

La opción directa

La opción más directa para acceder al campo es usar la estructura que podemos ver en $node. Para acceder a la variable de un campo solo hemos de hacer $node->field_telefono. El problema es que esta variable tiene una estructura compleja y que nada fácil de usar de modo seguro.

Primero de todo, es un array indexado por el lenguage del campo. Si el campo no tiene lenguage tenemos que acceder así : $node->field_telefono['und] ( o LANGUAGE_NONE en vez de 'und') . Pero esto tampoco nos da el valor, es otra estructura. Puesto que drupal permite tener colecciones de valores asociadas a un campos, todos los campos, sean o no de multiples valores son un array de valores. Para acceder al primer ( y único valor en este ejemplo) tendremos que hacer $node->field_telefono['und'][0]['value'] . ¿ Y este 'value' final que es ? Como puedes imaginar, ese último acceso es porque el campo tiene una estructura propia también dentro.

Los problemas de este acceso

Al acceder a través de lenguage fijo nos encontraremos que si el campo tiene en algún caso un lenguage diferente tendremos un error de acceso. Podriamos pensar que podemos usar la variable de lenguage del nodo ( $node->language ), pero por experiencia he podido comprobar que no funciona como uno espera, pues el nodo puede tener un lenguaje y el campo otro, un lio.

La alternativa

Drupal pone a nuestra disposición la función field_get_items(). Esta función nos devolverá un array con los elementos del campo. Ejemplo :

<?php
$elementos_campo = field_get_items('node', $node, 'field_telefono');
$elementos_campo[0];// PRIMER ELEMENTO
?>

A partir de aquí podemos acceder a los datos en "crudo" del campo.

Un momeno, pero si yo solo quiero mostrar el campo

Pues, si solo quieres mostrar el campo, tal como Drupal lo mostraria, solo que en otro sitio y orden, es mucho más fácil que todo esto : usa la función render(). Esta función te visualiza el campo tal como lo haria Drupal, solo que tu controlas donde y cuando. Ejemplo:

<?php
print render($content['field_telefono']);
hide($content['field_telefono']);
?>

Te estás haciendo dos preguntas: ¿ que es la variable $content ? y  ¿ por qué uso la función hide()?. La variable $content tiene todos los datos de visualización del nodo (no tengas tentaciones de usarla para acceder a los datos en crudo porque es bastante más compleja que $node). La función hide() le dice a Drupal que no muestre este campo cuando más tarde hagamos el render($content). Sobretodo, has de asegurarte que el campo está configurado para ser visible, sino el render no visualizará nada.

Conclusión

Con esto que hemos comentado hoy tenemos muchas herramientas para realizar todo tipo de modificaciones a nuestros templates, aún quedan algunas cosillas más, pero no tan importantes como estas y que las explicaremos más adelante.