Imprimir regiones en html.tpl.php

10

Necesito generar algunas regiones en la plantilla html.tpl.php, ya que estas no cambian entre page.tpl.php y page-front.tpl.php (solo por nombrar dos). Básicamente quiero evitar la duplicación de código.

Sin embargo, parece que no hay nada asociado con las regiones en html.tpl.php, ni pude recuperar nada usando drupal_get_region_content (con y sin parámetros, solo devuelve una matriz vacía).

Ideas?

Morpheu5
fuente
¿Solías drupal_set_region_content()configurar el contenido de la región?
kiamlaluno
2
No hay tal función. Tal vez quisiste decir, drupal_add_region_content()pero no veo ningún punto en ello: configuro el contenido de las regiones a través de la interfaz de administración de bloques.
Morpheu5
1
Sí, quise decir drupal_add_region_content().
kiamlaluno

Respuestas:

18

Resolví así:

function mytheme_preprocess_html(&$variables) {
    $variables['region_name'] = block_get_blocks_by_region('region_name');
}

y luego pude hacer

<?php print render($region_name) ?>
Morpheu5
fuente
¿Por qué usar echo? Por supuesto que funciona.
SDMulroy
Claro, si estuviera implementando un módulo o tema público, me vería obligado a seguir los estándares de la comunidad. Este era un tema personalizado que estaba siendo utilizado exclusivamente por mi cliente.
Morpheu5
Sé que esta es una publicación extremadamente antigua, pero creo que es de mal criterio aceptar una respuesta donde el autor de la respuesta responde perezosamente la pregunta. Por ejemplo, proporciona una función para agregar, pero asume que todos los lectores sabrán mágicamente dónde debería vivir este código. Esa es la parte perezosa y estoy rechazando esto, ya que no proporciona nada a los usuarios / desarrolladores novatos de drupal.
Bolos
Agradezco su aporte y el hecho de que los novatos pueden no estar recibiendo una explicación completa. Sin embargo, tenga en cuenta que a) la alimentación con cuchara es para principiantes perezosos, yb) para cualquiera que incluso haya leído rápidamente los documentos (como debería haberlo hecho cualquier principiante no perezoso), la ubicación de esa función debería ser relativamente obvia. Si no es así, entonces hay un manual por una buena razón. Mi pregunta (y respuesta) trata un problema a un nivel en el que se puede asumir un cierto conocimiento básico del tema de Drupal. Además, este es un sitio de preguntas y respuestas, el sitio de Docs está al lado.
Morpheu5
1
@Skitties No podemos duplicar aquí la documentación solo porque los nuevos usuarios no pueden saber qué funciones de preproceso son las que se muestran en la pregunta. Eso ni siquiera es parte de la pregunta. Si los usuarios tienen una pregunta específica sobre las funciones de preproceso, harán una nueva pregunta.
kiamlaluno
2

drupal_get_region_content()devuelve el contenido que se configuró con llamadas anteriores a drupal_add_region_content(), pero no incluye el contenido de los bloques, que se representan en la página a través de block_page_build () .

Si busca "drupal_add_region_content" en el código fuente de Drupal, notará que la función es llamada por:

  • drupal_get_region_content()
  • install_display_output()
  • template_preprocess_maintenance_page()
  • update_task_list()

Lo que configura para los bloques en la página administrativa es en qué regiones se representarán los bloques, pero su contenido no se agrega drupal_add_region_content(); de hecho, ninguna de las funciones enumeradas anteriormente (que son las únicas funciones que llaman drupal_add_region_content(), excepto el código para probar una instalación de Drupal) es para representar / agregar el contenido del bloque.

Si necesita representar los bloques en su propio código, debe verificar el código utilizado en block_page_build(). En particular, este es el código que probablemente sea más útil para usted:

  // Fetch a list of regions for the current theme.
  $all_regions = system_region_list($theme);

  $item = menu_get_item();
  if ($item['path'] != 'admin/structure/block/demo/' . $theme) {
    // Load all region content assigned via blocks.
    foreach (array_keys($all_regions) as $region) {
      // Assign blocks to region.
      if ($blocks = block_get_blocks_by_region($region)) {
        $page[$region] = $blocks;
      }
    }
    // …
  }

Las primeras dos líneas verifican que la página que se muestra no es la página de demostración utilizada para mostrar dónde se ubican las regiones temáticas.

Si necesita renderizar los bloques de una manera diferente, es más probable que esté interesado en anular theme_block () en su tema, o (aún más probable) crear un archivo de plantilla block.tpl.php personalizado. Otra forma de alterar la forma en que se representan los bloques es usar una función de preproceso para los bloques ( hook_preprocess_block () ).

kiamlaluno
fuente