web-dev-qa-db-fra.com

Impression des régions dans html.tpl.php

J'ai besoin de sortir certaines régions dans le modèle html.tpl.php car celles-ci ne changent pas entre page.tpl.php et page-front.tpl.php (pour n'en nommer que deux). Fondamentalement, je veux éviter la duplication de code.

Cependant, il ne semble y avoir rien d'associé aux régions dans html.tpl.php, et je n'ai pas pu récupérer quoi que ce soit en utilisant drupal_get_region_content (à la fois avec et sans paramètres, il retourne juste un tableau vide).

Des idées?

10
Morpheu5

J'ai résolu comme ceci:

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

et puis je pourrais faire

<?php print render($region_name) ?>
18
Morpheu5

drupal_get_region_content() renvoie le contenu qui a été défini lors des appels précédents à drupal_add_region_content(), mais il n'inclut pas le contenu des blocs, qui sont rendus dans la page via block_page_build () .

Si vous recherchez "drupal_add_region_content" dans Drupal code source, vous remarquerez que la fonction est appelée par:

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

Ce que vous définissez pour les blocs dans la page d'administration, c'est dans quelles régions les blocs seront rendus, mais leur contenu n'est pas ajouté avec drupal_add_region_content(); en fait, aucune des fonctions énumérées ci-dessus (qui sont les seules fonctions appelant drupal_add_region_content(), à l'exception du code pour tester une Drupal) est pour rendre/ajouter le contenu du bloc .

Si vous devez rendre les blocs dans votre propre code, vous devez vérifier le code utilisé dans block_page_build(). En particulier, c'est le code qui vous est probablement le plus utile:

  // 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;
      }
    }
    // …
  }

Les deux premières lignes vérifient que la page affichée n'est pas la page de démonstration utilisée pour montrer où les régions thématiques sont placées.

Si vous avez besoin de rendre les blocs d'une manière différente, il est plus probable que vous souhaitez remplacer theme_block () dans votre thème, ou (plus probablement encore) créer un modèle block.tpl.php personnalisé fichier. Une autre façon de modifier la façon dont les blocs sont rendus est d'utiliser une fonction de prétraitement pour les blocs ( hook_preprocess_block () ).

2
kiamlaluno