Impression des régions dans html.tpl.php

10

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?

Morpheu5
la source
Avez-vous utilisé drupal_set_region_content()pour définir le contenu de la région?
kiamlaluno
2
Il n'y a pas une telle fonction. Peut-être que vous vouliez dire, drupal_add_region_content()mais je n'y vois aucun intérêt: je définis le contenu des régions via l'interface d'administration des blocs.
Morpheu5
1
Oui, je voulais dire drupal_add_region_content().
kiamlaluno

Réponses:

18

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) ?>
Morpheu5
la source
Pourquoi utiliser l'écho? Bien sûr, cela fonctionne.
SDMulroy
Bien sûr, si je mettais en œuvre un module ou un thème public, je serais obligé de suivre les normes de la communauté. C'était un thème personnalisé qui était utilisé exclusivement par mon client.
Morpheu5
Je sais que c'est un article extrêmement ancien, mais je pense que c'est un mauvais jugement d'accepter une réponse où l'auteur de la réponse répond paresseusement à la question. Par exemple, vous fournissez une fonction à ajouter, mais supposez que tous les lecteurs sauront comme par magie où ce code devrait vivre. C'est la partie paresseuse et je vote pour cela car cela ne fournit rien aux utilisateurs / développeurs drupal novices.
Skittles
J'apprécie votre contribution et le fait que les novices n'obtiennent peut-être pas une explication complète. Cependant, veuillez considérer que a) l'alimentation à la cuillère fait pour les novices paresseux, et b) pour quiconque a même lu rapidement les documents (comme tout novice non paresseux devrait avoir) le placement de cette fonction devrait être relativement évident. Si ce n'est pas le cas, il existe un manuel pour une bonne raison. Ma question (et réponse) traite d'un problème à un niveau où une certaine connaissance de base de la thématique Drupal peut être supposée. De plus, il s'agit d'un site de questions / réponses, le site Docs est à côté.
Morpheu5
1
@Skitties Nous ne pouvons pas dupliquer ici la documentation simplement parce que les nouveaux utilisateurs ne pouvaient pas savoir quelles sont les fonctions de prétraitement comme celle illustrée dans la question. Cela ne fait même pas partie de la question. Si les utilisateurs ont une question spécifique sur les fonctions de prétraitement, ils poseront une nouvelle question.
kiamlaluno
2

drupal_get_region_content()renvoie le contenu qui a été défini avec les 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 le code source de Drupal, 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 listées ci-dessus (qui sont les seules fonctions appelantes drupal_add_region_content(), à l'exception du code pour tester une installation Drupal) n'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 fichier de modèle block.tpl.php personnalisé. 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 () ).

kiamlaluno
la source