10
Mayo
2011
Papaya Media

Personalización de Breadcrumbs en Drupal

Hace mucho no me pasaba por acá, pero tengo el firme propósito de estar pasando más seguido, así sea para poner mini-módulos como el que les comparto hoy.

La idea de este módulo es mostrar cómo podemos modificar los breadcrumbs en Drupal, pues drupal hace lo que puede, pero no es adivino respecto a lo que nosotros queremos.

Antes de entrar en detalles, les recomiendo el uso del módulo Custom Breadcrumbs, que sirve exactamente para lo que sirve el módulo que muestro aquí pero con la limitante de que sólo se pueden configurar nodos (y no otras URL) y se configura una plantilla de breadcrumbs por cada tipo de contenido. La ventaja que tiene poder crear nuestro propio módulo es que podemos crear breadcrumbs tan personalizados como queramos, e incluso podemos poner breadcrumbs personalizados para una página específica, como es el caso de esta página que estás leyendo ¿no lo habías notado?.

Bueno, ahora sí al grano. Lo primero que hacemos es crear el directorio y los archivos base como ya se explicó en otra ocasión. En mi caso, el módulo se llamará papaya_breadcrumbs.

Haremos uso de la función de Drupal template_preprocess_page(&$variables). Básicamente, si vas a revisar el archivo page.tpl.php que está en la carpeta del tema que estás usando, podrás ver que allí hay muchas variables. Cada una de esas variables es la llave dentro de la variable $variables que es el argumento de la función que estmos usando. Esto suena muy enredado, pero para aclararlo mejor escribimos un ejemplo. Una de las primeras variables que aparecen en el archivo page.tpl.php del tema que yo uso es:

<title><?php print $head_title; ?></title>

Como tenemos la variable $head_title, entonces podemos modificar esa varialbe con template_preprocess_page, editando el valor de $variables['head_title']. Así no tenemos que ir y editar el archivo del tema directamente.

Entonces, el tema también tiene una variable llamada $breadcrumb que es la que editaremos en este ejemplo por medio de $variables['breadcrumb'].

Aquí va el código del archivo papaya_breadcrumbs.module:

<?php
 
/**
  * Implementation of template_preprocess_page().
  */
 
function papaya_breadcrumbs_preprocess_page(&$variables) {
   
$args = arg();
    if (
$args[0] == 'node' && is_numeric($args[1]) && count($args) == 2) { // El usuario está viendo un nodo
     
$node = node_load($args[1]);
      if (
$node->type == 'page') { // El nodo es una página (tipo de contenido)
       
$breadcrumb = array();
       
$breadcrumb[] = l('Inicio', '<front>'); // Siempre, sin excepción, el link a la página principal tiene que ponerse de primero.
       
$terms = array();
        foreach(
$node->taxonomy as $term) { // Voy a recorrer el arreglo de todas las categorías a las que pertenece esta página.
         
$terms[] = l($term->name, 'taxonomy/term/' . $term->tid);
        }
        if (
$terms) {
         
$terms = implode(', ', $terms);
         
$breadcrumb[] = $terms;
        }
       
$breadcrumb[] = $node->title;
       
$variables['breadcrumb'] = theme('breadcrumb', $breadcrumb);
      }
      if (
$args[1] == 18) { // Esta validación se usa únicamente para poder mostrar breadcrumbs personalizados en el nodo 18
       
$breadcrumb = array();
       
$breadcrumb[] = l('Muchos', '<front>');
       
$breadcrumb[] = l('Enlaces', 'http://www.sincontrol.net');
       
$breadcrumb[] = 'Y no enlaces';
       
$breadcrumb[] = l('de', 'node/18');
       
$breadcrumb[] = l('ejemplo', 'node/8');
       
$breadcrumb[] = l('Sin', 'node/13');
       
$breadcrumb[] = l('sentido', 'node/10');
       
$breadcrumb[] = '¿Cómo le pareció?';
       
$variables['breadcrumb'] = theme('breadcrumb', $breadcrumb);
      }
    }
  }
?>

Como ya sabemos, el nombre de la función tiene que empezar con el nombre de nuestro módulo, si no es así el módulo no funcionará. Es por esto que hemos reemplazado la palabra template por papaya_breadcrumbs, para crear la función papaya_breadcrumbs_preprocess_page.

La función arg() es de drupal y nos trae un arreglo con todas las partes de la variable q de la URL si no estamos usando URLs limpias, o todo lo que esté después del dominio si estamos usando URLs limipas. Hay que tener en cuenta que independientemente de si estamos usando alias para nuestras URLs, arg() siempre traerá los argumentos de la URL original.

El primer condicional lo hago para saber si el usuario está viendo un nodo. Pero ustedes pueden agregar sus propios condicionales, por ejemplo para saber si se está viendo una página de un término de taxonomía (taxonomy/term/%).

El segundo condicional lo hago para saber que el usuario está viendo un nodo de tipo de contenido "Página". Así se pueden crear distintos breadcrumbs en Drupal para distintos tipos de páginas.

Después viene lo realmente interesante. Tendremos que crear un arreglo en el cual cada elemento tendrá el link (o texto sin link) del breadcrumb. Es importante anotar que siempre, sin excepción, el primer elemento deberá ser el enlace dirigido al home page. Esto es porque algunos temas tienen la opción de eliminar el link a la página de inicio automáticamente, pero ellos no chequean que el link en serio vaya hacia el home page y lo único que hacen es eliminar el primer elemento del arreglo.

Para crear link usamos la función de Drupal l(), que recibe 2 argumentos (en realidad recibe 3 pero el tercero es opcional), el primero es el texto del enlace y el segundo es la URL de destino. Esta URL puede ser una URL interna de drupal o una URL externa.

En nuestro ejemplo, para todas las páginas pusimos el enlace a la página de inicio, seguido de los enlaces a las categorías a las que pertenece el nodo (revisar el breadcrumb de esta otra página para ver que pusimos más de un link en el mismo elemento del breadcrumb) y finalmente está el título del nodo, que no es un link pues el usuario ya está en esa página.

Una vez hemos terminado de crear el arreglo en la variable $breadcrumb usamos la función theme() de Drupal para generar el breadcrumb de la página y guardarlo en la variable $variables['breadcrumb'], que más tarde se lo pasará a la variable $breadcrumb dentro del archivo page.tpl.php.

Como ejemplo adicional, hay un condicional que chequea si el usuario está viendo el nodo 18 (la página que estás leyendo), para hacer un breadcrumb especial.

¿Cómo te pareció? ¡Fácil!

Aquí dejo el link para que puedas descargar el módulo de este ejemplo para que te sirva de base para crear tus propios breadcrumbs en Drupal: papaya_breadcrumbs.tar.gz

Hola, Yo soy colombiano y me

Enviado por elgris (no verificado) el Jue, 06/30/2011 - 11:01.

Hola,

Yo soy colombiano y me encontré tu blog buscando info de drupal. Ahora vivo en España, así que no espero que me cuentes como extranjero!!

Tengo una duda, he comenzado con drupal a los cabezazos, porq me ha tocado coger un proyecto de otro a medio hacer.

El tiene el custom breadcrums, en el template.php.

Yo quiero poner el tuyo... pero no se como..

él tiene esta funcion en el template.

function danland_breadcrumb($breadcrumb)

donde hay algo mas de 70 lineas.

Me puedes ayudar?

Gracias!!

Y muy buena tu pagina por cierto.. ya ta en favoritos.

Un saludo!!

El ejemplo que puse acá es

Enviado por Papaya Media el Jue, 06/30/2011 - 12:09.

El ejemplo que puse acá es sólo para Drupal 6.  Si tiene D6 entonces debe descargar y descomprimir este módulo en la carpeta de módulos del sitio, como haría con cualquier otro módulo.

Después lo activa en la página de módulos y debe empezar a modificar el archivo papaya_breadcrumbs.module según sus necesidades.  Necesitará algunas bases de PHP para poder editarlo.

Si el módulo no le funciona es posible que haya otro módulo sobreescribiéndolo.  Para evitar eso puede instalar el módulo Module Weight, incluído en Util, y le pone un valor alto en la lista de módulos, con eso se asegura que se ejecuta de último.

Si esa no era la duda me avisa y lo revisamos.

Un saludo.

Gracias!! Se que ha pasado

Enviado por elgris (no verificado) el Sáb, 08/06/2011 - 06:31.

Gracias!!

Se que ha pasado tiempo, yo no he podido probar la info que me pasaste, per queria agradecer la ayuda.
Espero poder ponerlo en practica en otro proyecto.

Muchas gracias de verdad!!

Un saludo

Alejandro

Bueno el tuto aunque yo

Enviado por Frezeer (no verificado) el Mié, 05/11/2011 - 16:54.

Bueno el tuto aunque yo utilizo la funcion de drupal para editar el breadcrumbs sin necesidad de crear mas hook, simplemente la llamo en el theme del contenido que voy a mostrar, gracias por los tutos se ven bien.

La función a la que se

Enviado por Papaya Media el Mié, 05/11/2011 - 17:10.

La función a la que se refiere Frezeer es drupal_set_breadcrumb()

Gracias por el aporte.

El problema es que si se edita el template del tema, al cambiar de tema tendríamos que hacer esa modificación también, mientras que usando la opción propuesta aquí no se afectaría el sitio.

Otra ventaja de esta funcion es que no sólo sirve para editar el breadcrumb sino que sirve para editar cualquier variable que tengamos dentro del archivo page.tpl.php en la carpeta del tema.  Incluso podríamos agregar nuestras propias variables al tema y con este módulo editarles el contenido.

Enviar un comentario nuevo

El contenido de este campo se mantiene privado y no se mostrará públicamente.
  • No se admite ninguna etiqueta HTML
  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Saltos automáticos de líneas y de párrafos.

Más información sobre opciones de formato