Páginas

24 de septiembre de 2015

Mostrar las variables disponibles para nuestro theme en Drupal 7.x

Cuando estamos trabajando al nivel del theme layer (temas), por ejemplo en nuestro node.tpl.php, a veces nos preguntamos cuales son las variables que tenemos a disposición, es decir cuales son las variables que son enviadas a nuestro archivo .tpl.php
En este post veremos que los archivos .tpl.php de nuestra instalación Drupal están en realidad muy bien documentados pero veremos también otra manera más sencilla y dinámica utilizando la función get_defined_vars().

Archivos .tpl.php
Una forma sencilla y rápida es de tomar el archivo .tpl.php que viene por defecto con nuestra instalación Drupal y al principio de este encontraremos la lista detallada y bien comentada de las variables disponibles.


Para node.tpl.php iremos en modules > node > node.tpl.php, para page.tpl.php iremos en modules > system > page.tpl.php (en system, encontraremos también region.tpl.php y html.tpl.php), en fin para field.tpl.php iremos en modules > field > theme > field.tpl.php
Por ejemplo, al inicio de nuestro archivo node.tpl.php encontramos la información siguiente:
<?php/**
* @file
* Default theme implementation to display a node.
*
* Available variables:
* - $title: the (sanitized) title of the node.
* - $content: An array of node items. Use render($content) to print them all,
*   or print a subset such as render($content['field_example']). Use
*   hide($content['field_example']) to temporarily suppress the printing of a
*   given element.
* - $user_picture: The node author's picture from user-picture.tpl.php.
* - $date: Formatted creation date. Preprocess functions can reformat it by
*   calling format_date() with the desired parameters on the $created variable.
* - $name: Themed username of node author output from theme_username().
* - $node_url: Direct url of the current node.
* - $display_submitted: Whether submission information should be displayed.
* - $submitted: Submission information created from $name and $date during
*   template_preprocess_node().
* - $classes: String of classes that can be used to style contextually through
*   CSS. It can be manipulated through the variable $classes_array from
*   preprocess functions. The default values can be one or more of the
*   following:
*   - node: The current template type, i.e., "theming hook".
*   - node-[type]: The current node type. For example, if the node is a
*     "Blog entry" it would result in "node-blog". Note that the machine
*     name will often be in a short form of the human readable label.
*   - node-teaser: Nodes in teaser form.
*   - node-preview: Nodes in preview mode.
*   The following are controlled through the node publishing options.
*   - node-promoted: Nodes promoted to the front page.
*   - node-sticky: Nodes ordered above other non-sticky nodes in teaser
*     listings.
*   - node-unpublished: Unpublished nodes visible only to administrators.
* - $title_prefix (array): An array containing additional output populated by
*   modules, intended to be displayed in front of the main title tag that
*   appears in the template.
* - $title_suffix (array): An array containing additional output populated by
*   modules, intended to be displayed after the main title tag that appears in
*   the template.
*
* Other variables:
* - $node: Full node object. Contains data that may not be safe.
* - $type: Node type, i.e. story, page, blog, etc.
* - $comment_count: Number of comments attached to the node.
* - $uid: User ID of the node author.
* - $created: Time the node was published formatted in Unix timestamp.
* - $classes_array: Array of html class attribute values. It is flattened
*   into a string within the variable $classes.
* - $zebra: Outputs either "even" or "odd". Useful for zebra striping in
*   teaser listings.
* - $id: Position of the node. Increments each time it's output.
*
* Node status variables:
* - $view_mode: View mode, e.g. 'full', 'teaser'...
* - $teaser: Flag for the teaser state (shortcut for $view_mode == 'teaser').
* - $page: Flag for the full page state.
* - $promote: Flag for front page promotion state.
* - $sticky: Flags for sticky post setting.
* - $status: Flag for published status.
* - $comment: State of comment settings for the node.
* - $readmore: Flags true if the teaser content of the node cannot hold the
*   main body content.
* - $is_front: Flags true when presented in the front page.
* - $logged_in: Flags true when the current user is a logged-in member.
* - $is_admin: Flags true when the current user is an administrator.
*
* Field variables: for each field instance attached to the node a corresponding
* variable is defined, e.g. $node->body becomes $body. When needing to access
* a field's raw values, developers/themers are strongly encouraged to use these
* variables. Otherwise they will have to explicitly specify the desired field
* language, e.g. $node->body['en'], thus overriding any language negotiation
* rule that was previously applied.
*
* @see template_preprocess()
* @see template_preprocess_node()
* @see template_process()
*/
?>

Otra manera de encontrar las variables disponibles es de ir en la API de Drupal y buscar por cada archivo .tpl.php. En realidad encontraremos la misma información que en los archivos de nuestra instalación.

La fución get_defined_vars()
Pero qué pasa con las variables generadas por otros modulos? O como podríamos ver los valores de dichas variables si no las conocemos? Para ello en nuestro archivo .tpl.php vamos a llamar a la función get_defined_vars(). No busquen en la API de Drupal, no la econtrarán, es una función de nuestro viejo PHP.

En la documentación de PHP encontramos: “Esta función devuelve una matriz multidimensional que contiene una lista de todas las variables definidas, ya sean variables de entorno, de servidor o definidas por el usuario, en el ámbito que get_defined_vars() es llamado.” Excelente, es justamente lo que necesitamos!

Por ejemplo, al inicio de nuestro archivo node.tpl.php ponemos lo siguiente:
<?php print '<pre>';print_r(array_keys(get_defined_vars()));
print
'</pre>';?>

Pero la salida no es muy útil, por ello es mejor utilizar la function dsm() del módulo devel (http://drupal.org/project/devel) la aplicamos como sigue:
<?php
dsm
(get_defined_vars());?>
Voilà, dos maneras distintas pero muy útiles de encontrar o descubrir las variables que son enviadas a nuestro theme.

Referencias:
API de Drupal: http://api.drupal.org/api/drupal
field.tpl.php: http://api.drupal.org/api/drupal/modules--field--theme--field.tpl.php/7
node.tpl.php : http://api.drupal.org/api/drupal/modules--node--node.tpl.php/7
page.tpl.php: http://api.drupal.org/api/drupal/modules--system--page.tpl.php/7
region.tpl.php: http://api.drupal.org/api/drupal/modules--system--region.tpl.php/7
html.tpl.php: http://api.drupal.org/api/drupal/modules--system--html.tpl.php/7
get_defined_vars(): http://php.net/manual/es/function.get-defined-vars.php
El modulo Devel: http://drupal.org/project/devel
La función dsm(): http://drupalcontrib.org/api/drupal/contributions--devel--devel.module/f...

fuente: http://www.webenstock.com/es/blog/2012-01-05-mostrar-variables-disponibles-nuestro-theme-en-drupal-7x