La semana pasada hemos visto como crear un bloque de artículos relacionados y cómo colocarlo en nuestro nodo con el sistema de bloques de Drupal. Pero nos dimos cuenta que este nuevo bloque se mostraba por debajo de los comentarios, lo que no es la mejor ubicación.
Hoy vamos a ver cómo insertar este bloque en el contenido de nuestro nodo para tener mayor flexibilidad al nivel de nuestro layout. Veremos una manera sencilla trabajando a nivel de node--article.tpl.php pero otra también trabajando más limpiamente a nivel del pre procesamiento (preprocess) del nodo con la función theme_preprocess_node().
La semana pasada habiamos tomado como ejemplo trabajar con el tipo de contenido Artículo creando una vista 'related_articles' con un display 'block'.
1. Insertar el bloque en un tpl
Abrimos el archivo node.tpl.php de nuestro theme y lo guardamos como node--article.tpl.php
Editamos el archivo node-article.tpl.php y por debajo de print render($content['comments']) insertamos el siguiente código:
<?php
if ($page){
print views_embed_view('related_articles', $display_id = 'block');
}
?>o el siguiente código si deseamos mostrar el título de la vista:
<?php
if ($page){
// Dar el nombre sistema de la vista
$view = views_get_view('related_articles');
// Mostrar el título
print '<h2>'.$view->get_title().'</h2>';
// Dar el ID del display que queremos
print $view->preview('block');
}
?>Es en realidad una solución bastante utilizada pero que no sigue el correcto camino de separar la lógica de la presentación. Podemos entonces poner esta lógica a nivel del pre procesamiento del nodo en nuestro archivo template.php de nuestro theme de Drupal.
2. Insertar el bloque por una función preprocess
En el archivo template.php de nuestro theme, vamos a añadir el siguiente código en la función NOMBRE-DEL-THEME_preprocess_node(&$variables). Gracias a ello vamos a crear una nueva variable $related que contiene nuestro bloque de artículos relacionados. Esta variable será disponible en nuestro archivo node--article.tpl.php donde el themer podrá colocar el bloque donde quiere.
<?php
function NOMBRE-DEL-THEME_preprocess_node(&$variables)(&$variables) {
// .....
// solo para nodo de tipo article
// no ponemos el bloque en el teaser
if ($variables['type'] == 'article' and !$variables['teaser']){
$view_node = views_get_view('related_articles');
$myblock_related = '<h2>'.$view_node->get_title().'</h2>';
$myblock_related .= $view_node->preview('block');
// crear la nueva variable $related en nuestro contenido
$variables['content']['related'] = $myblock_related;
}
}
?>Después, en nuestro archivo node--article.tpl justo por debajo de render($content['comments']) insertamos el código siguiente:
<?php
if ($page){
// Mostrar los artículos relacionados
print render($content['related']);
}
?>Voilà, hemos visto como insertar un bloque en Drupal 7 directamente en nuestro archivo tpl y también como hacerlo con una función preprocess.
Si tiene preguntas, no duden en poner un comentario.
Referencias:
La fonction views_embed_view()
La fonction template_preprocess_node()
Le tpl node.tpl.php
La fonction render()
Render a block programmatically: http://www.computerminds.co.uk/drupal-code/render-block-programmatically



Comentarios recientes
hace 4 días 17 horas
hace 5 días 23 horas
hace 6 días 17 horas
hace 6 días 20 horas
hace 13 semanas 6 días
hace 14 semanas 1 día
hace 7 semanas 1 día
hace 10 semanas 5 días
hace 11 semanas 21 horas
hace 11 semanas 4 días