Hero

Como personalizar el pager de la página de blog en Drupal 7

Marzo 01, 2013

enzo
Drupal
Tematización

El módulo de blog de Drupal 7 es muy útil y fácil de usar, pero algunas veces tareas sencillas de personalización se complican un poco al no existir hooks para extender la funcionalidad.

En esta entrada hablaremos de como personalizar el pager de la página /blog la cual se encarga de listas todas las entradas al blog del sitio por todos los usuarios.

  1. Modificar función del listado del blog.

Lo primero que debemos hacer es cambiar la función que se ejecuta para generar el listado del blog, la cual esta asociada a la ruta blog, para lo cual haremos uso del hook hook_menu_alter. El hook_menu_alter permite modificar la definición de un menu registrado por otros módulos.

En nuestro caso cambiaremos la función que se ejecuta la ingresar la ruta /blog como se muestra a continuación.

/**
 * Implements hook_menu_alter().
 */
function MIMODULO_menu_alter(&$items) {
 $items['blog']['page callback'] = 'MIMODULO_blog_page_last';
}

Con el anterior código cuando se borre el cache de los menúes la función MIMODULO_blog_last_page sera la que se ejecutara y sera una copia casi exacta de la función blog_page_last definida en el modulo blog dentro del archivo blog.pages.inc.

  1. Definición de la nueva función blog.

Ahora procederemos a la definición de la nueva función como se muestra a continuación.

/**
 * Menu callback; displays a Drupal page containing recent blog entries of all users.
 */
function MIMODULO_blog_page_last() {
 global $user;
 $build = array();

 $query = db_select('node', 'n')->extend('PagerDefault');
 $nids = $query
 ->fields('n', array('nid', 'sticky', 'created'))
 ->condition('type', 'blog')
 ->condition('status', 1)
 ->orderBy('sticky', 'DESC')
 ->orderBy('created', 'DESC')
 ->limit(variable_get('default_nodes_main', 10))
 ->addTag('node_access')
 ->execute()
 ->fetchCol();

 if (!empty($nids)) {
 $nodes = node_load_multiple($nids);
 $build += node_view_multiple($nodes);
 $build['pager'] = array(
 '#theme' => 'pager',
 '#weight' => 5,
 '#tags' => array(t('«'),t('‹'),'',t('›'),t('»')),
 );
 }
 else {
 drupal_set_message(t('No blog entries have been created.'));
 }
 drupal_add_feed('blog/feed', t('RSS - blogs'));

 return $build;
}

La única diferencia con la función original es la definición de pager, esta definición se hace por medio del Form API y mas exactamente de tipo #theme, el tipo #theme permite definir que función tema sera llamada, pero en la definición origina no se le envían ningún parámetro.

En este caso se la función tema theme_pager recibe varios parámetros entre ellos el parámetro $tags que definir los elementos de navegación, en este ejemplo se eliminaras los textos al lado de los símbolos de navegación y solo se dejaran los símbolos de navegación del pager como se muestra a continuación.

$build['pager'] = array(
 '#theme' => 'pager',
 '#weight' => 5,
 '#tags' => array(t('«'),t('‹'),'',t('›'),t('»')),
 );

Como se puede apreciar se debe usar el nombre del parámetro antecedido por el símbolo #. De esta forma se puede pasar cualquier parámetro esperado por cualquier función de tema.

Es importante indicar que aunque esta definición hace parte del Form API de Drupal no se esta llamando dentro de una función drupal_get_form, pero los menúes por defecto se procesan mediante la función drupal_render la cual interpreta los elementos definidos usando Form API.

Como resultado tendremos un pager similar al siguiente.

pager 0

Espero que haya sido de su agrado.

enzo.

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.