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
¿Cómo hago para aplicar ésta
¿Cómo hago para aplicar ésta función en Drupal 7?
No la he usado en Drupal 7,
No la he usado en Drupal 7, pero según la documentación de Drupal funciona igual en Drupal 6, 7 y 8.
Me acabo de dar cuenta que
Me acabo de dar cuenta que las taxonomías en el breadcrumb me aparecen en orden alfabético y no en orden jerárquico, ¿se puede solucionar?
¿Y como haríamos para agregar
¿Y como haríamos para agregar title="descripción de la taxonomía" a cada link?
Esto es lo que tengo: item
Esto lo que quiero conseguir: item
Para agregar más datos al
Para agregar más datos al link se debe usar el tercer argumento de la función l(), que es el arreglo $options, y cuyas características se describen mejor en la función url(). Entonces en nuestro ejemplo podríamos reemplazar la línea
por
Me ha sido de mucha ayuda tu
Me ha sido de mucha ayuda tu respuesta, muchas gracias.
Te acabas de ganar un fan, jeje... :-)
No me las sé todas con
No me las sé todas con Drupal, pero con mucho gusto comparto lo que conozco.
¿Y si quiero personalizar el
¿Y si quiero personalizar el breadcrumb de las páginas de taxonomías aparte de los nodos como sería?
Por cierto, la web donde lo estoy aplicando es: http://www.SEOlandia.com/
En ese caso debe agregar un
En ese caso debe agregar un condicional IF adicional, que sería algo así como:
Gracias. Y en ese caso para
Gracias.
Y en ese caso para recorrer las taxonomías qué ponemos en el bucle en lugar de
foreach($node->taxonomy as $term)
?
Enviar un comentario nuevo