¿Se pueden imprimir regiones dentro de una plantilla de nodo?

25

¿Se pueden imprimir regiones dentro de una plantilla de nodo, o están las regiones estrictamente limitadas a las plantillas de página?

tim76
fuente

Respuestas:

48

Puede imprimir regiones dentro de cualquier plantilla, pero no están disponibles de fábrica en la node.tpl.phpplantilla. Para que estén disponibles, creará una nueva variable para usar en su node.tpl.phpplantilla que contendrá todo el contenido de la región.

La creación de nuevas variables de plantilla se realiza mediante una función de preproceso. En el template.phparchivo de su tema , cree una función que se vea así:

function mytheme_preprocess_node(&$variables) {
}

Reemplazar mythemecon el nombre corto de su tema. Ahora, para que Drupal reconozca esta nueva función de preproceso, debe reconstruir el registro de temas de su sitio. Esto es tan sencillo como ir a ConfiguraciónDesarrolloRendimiento y presionar el botón "Borrar todas las cachés" en la parte superior.

Ahora, la forma en que funcionan las funciones de preproceso es que $variablescontiene una matriz que corresponde a las variables disponibles de su plantilla. Por ejemplo, en node.tpl.php, $submittedcontiene el autor byline. En la función de preproceso anterior, se encuentra en $variables['submitted'].

Para imitar lo que tiene page.tpl.php, donde tiene una matriz llamada $pageque contiene todas las regiones, desea completar $variables['page'].

El problema es que $pageen la node.tpl.phpque ya se rellena con un valor de verdadero / falso que le permite saber si usted está buscando en el nodo por sí mismo o en una lista.

Entonces, para evitar esa colisión de nombres, complete en su $regionlugar:

function mytheme_preprocess_node(&$variables) {

  // Get a list of all the regions for this theme
  foreach (system_region_list($GLOBALS['theme']) as $region_key => $region_name) {

    // Get the content for each region and add it to the $region variable
    if ($blocks = block_get_blocks_by_region($region_key)) {
      $variables['region'][$region_key] = $blocks;
    }
    else {
      $variables['region'][$region_key] = array();
    }
  }
}

Luego, en la node.tpl.phpplantilla de su tema , puede representar cualquier región haciendo lo siguiente:

<?php print render($region['sidebar_first']); ?>

¿Dónde sidebar_firstestá el nombre de la región que desea renderizar?


fuente
1
Finalmente una solución de trabajo para Drupal 7 :)
Eduard Luca
44
También hay una solución rápida y sucia que funcionó para mí <?php print render(block_get_blocks_by_region('machine_name_of_your_region'));?>. Desde aquí: webomelette.com/add-region-node-template
Darragh Enright
Esta solución es ingeniosa. ¿Podría dar ejemplos de cuándo es más aplicable a las regiones de impresión dentro de node.tpl.php en lugar de tenerlo en page.tpl.php?
Randell
Depende de tu diseño. A veces, el diseño puede colocar la barra lateral en un lugar donde es mucho más fácil el tema si estuviera dentro del nodo div en lugar de fuera de él.
rooby
¡No te olvides de los envoltorios regionales apropiados! Ver system_page_alter () para referencia. Recuerde que block_get_blocks_by_region()solo devuelve una matriz de bloques y si desea representarlo como una región, debe agregar un contenedor de región.
SiliconMind