Les régions peuvent-elles être imprimées dans un modèle de nœud?

25

Les régions peuvent-elles être imprimées dans un modèle de nœud, ou les régions sont-elles strictement limitées aux modèles de page?

tim76
la source

Réponses:

48

Vous pouvez imprimer des régions à l'intérieur de n'importe quel modèle, mais elles ne sont pas disponibles dès le départ dans le node.tpl.phpmodèle. Pour les rendre disponibles, vous allez créer une nouvelle variable à utiliser dans votre node.tpl.phpmodèle qui contiendra tout le contenu de la région.

La création de nouvelles variables de modèle se fait à l'aide d'une fonction de prétraitement. Dans le template.phpfichier de votre thème , créez une fonction qui ressemble à ceci:

function mytheme_preprocess_node(&$variables) {
}

Remplacer mythemepar le nom court de votre thème. Maintenant, pour que Drupal reconnaisse cette nouvelle fonction de prétraitement, vous devez reconstruire le registre des thèmes de votre site. C'est aussi simple que d'aller dans ConfigurationDéveloppementPerformances et d'appuyer sur le bouton "Effacer tous les caches" en haut.

Maintenant, la façon dont les fonctions de prétraitement fonctionnent est celle qui $variablescontient un tableau qui correspond aux variables disponibles de votre modèle. Par exemple, dans node.tpl.php, $submittedcontient la signature d'auteur. Dans la fonction de prétraitement ci-dessus, il se trouve dans $variables['submitted'].

Pour imiter ce que vous avez page.tpl.php, où vous avez un tableau appelé $pagequi contient toutes les régions, vous souhaitez remplir $variables['page'].

Le problème est que $pagedans node.tpl.phpest déjà rempli avec une valeur vraie / fausse qui vous permet de savoir si vous regardez le nœud seul ou dans une liste.

Donc, pour éviter cette collision de noms, remplissez $regionplutôt:

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();
    }
  }
}

Ensuite, dans le node.tpl.phpmodèle de votre thème , vous pouvez rendre n'importe quelle région en procédant comme suit:

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

sidebar_firstest le nom de la région que vous souhaitez rendre.


la source
1
Enfin une solution de travail pour Drupal 7 :)
Eduard Luca
4
Il y a aussi une solution rapide 'n' sale qui a fonctionné pour moi <?php print render(block_get_blocks_by_region('machine_name_of_your_region'));?>. De là: webomelette.com/add-region-node-template
Darragh Enright
Cette solution est astucieuse. Pourriez-vous donner des exemples de la période la plus appropriée pour imprimer des régions dans node.tpl.php au lieu de les avoir dans page.tpl.php?
Randell
Cela dépend de votre conception. Parfois, la mise en page peut placer la barre latérale à un endroit où il est beaucoup plus facile de créer un thème si elle était à l'intérieur du nœud div au lieu de l'extérieur.
rooby
N'oubliez pas les emballages de région appropriés! Voir system_page_alter () pour référence. N'oubliez pas que block_get_blocks_by_region()renvoie uniquement un tableau de blocs et si vous souhaitez le rendre en tant que région, vous devez ajouter un wrapper de région.
SiliconMind