Responder al comentario

Insertar un bloque en un nodo con Drupal 7.x

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
 

Tags:

Responder

El contenido de este campo se mantiene privado y no se mostrará públicamente.
  • Las direcciones de las páginas web y las de correo se convierten en enlaces automáticamente.
  • Etiquetas HTML permitidas: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd><img>
  • You may post code using <code>...</code> (generic) or <?php ... ?> (highlighted PHP) tags.
  • Saltos automáticos de líneas y de párrafos.

Más información sobre opciones de formato

By submitting this form, you accept the Mollom privacy policy.