web-dev-qa-db-fra.com

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

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?

25
tim76

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 modèle node.tpl.php. Pour les rendre disponibles, vous allez créer une nouvelle variable à utiliser dans votre modèle node.tpl.php 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 fichier template.php De votre thème, créez une fonction qui ressemble à ceci:

function mytheme_preprocess_node(&$variables) {
}

Remplacer mytheme par 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 à ConfigurationDéveloppementPerformance et en appuyant sur le bouton "Effacer tous les caches" en haut.

Maintenant, le fonctionnement des fonctions de prétraitement est que $variables Contient un tableau qui correspond aux variables disponibles de votre modèle. Par exemple, dans node.tpl.php, $submitted Contient la signature d'auteur. Dans la fonction de prétraitement ci-dessus, il se trouve dans $variables['submitted'].

Pour imiter ce que vous avez dans page.tpl.php, Où vous avez un tableau appelé $page Qui contient toutes les régions, vous voudrez remplir $variables['page'].

Le problème est que $page Dans node.tpl.php Est déjà rempli avec une valeur vrai/faux qui vous permet de savoir si vous regardez le nœud seul ou dans une liste.

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

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 modèle node.tpl.php De votre thème, vous pouvez rendre n'importe quelle région en procédant comme suit:

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

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

48
user7