Attribution de contenu aux régions

Traduction de la page http://drupal.org/node/171224
publiée/actualisée le 25 Mars 2011 sur Drupal.org.


Les regions sont des zones de votre thème qui recoivent des blocs et du contenu.

Les regions disponibles pour un thème sont indiquées dans le fichier .info. Elles doivent être spécifiées avec la clé regions suivie du nom machine de la région entre crochets et du nom compréhensible comme valeur. Par exemple : regions[theRegion] = Le nom de ma région .

Si aucune region n'est déclarée, ce sont les valeurs par défaut qui sont utilisées.

regions[left] = Left sidebar
regions[right] = Right sidebar
regions[content] = Content
regions[header] = Header
regions[footer] = Footer

Drupal 7 amène avec lui deux régions par défaut : Highlighted et Help. Par défaut, le contenu texte de cette région est le même que celui de la variable $help dans page.tpl.php de Drupal 6.

regions[highlighted] = Highlighted
regions[help] = Help

Le thème Drupal 7 Bartik dispose des régions par défaut suivantes :

regions[header] = Header
regions[help] = Help
regions[page_top] = Page top
regions[page_bottom] = Page bottom
regions[highlighted] = Highlighted

regions[featured] = Featured
regions[content] = Content
regions[sidebar_first] = Sidebar first
regions[sidebar_second] = Sidebar second

regions[triptych_first] = Triptych first
regions[triptych_middle] = Triptych middle
regions[triptych_last] = Triptych last

regions[footer_firstcolumn] = Footer first column
regions[footer_secondcolumn] = Footer second column
regions[footer_thirdcolumn] = Footer third column
regions[footer_fourthcolumn] = Footer fourth column
regions[footer] = Footer

Ayez à l'esprit que le nom interne est automatiquement converti en variable region dans le fichier gabarit page.tpl.php. Dans l'exemple précédent, la region [left] affichera tous les blocs qui lui sont affectés par le biais de la variable $left. Il y a quelques contraintes pour le nommage des variables PHP, assurez-vous que les noms internes les respectent. Ils doivent seulement contenir des caractères alphanumériques ou le signe souligné et doivent débuter par une lettre.

Le nom compréhensible mentionné comme valeur, à l'extérieur des crochets, est utilisé pour l'intitulé de la région dans la page d'administration des blocs située dans Administrer » Construction du site »Blocs. Dans Drupal 7, la paghe d'administration des blocs est située dans Administer > Structure > Blocks.

Voici la page d'administration des blocs pour Garland :

Drupal 7 - Tableau d'administration de blocs pour Bartik :

Quelques remarques :

  • Des fichiers template (.tpl.php) sont disponibles pour la mise en page individuelle de blocs.
  • Ajouter une région personnalisée désactive les régions par défaut. Si vous voulez conserver les régions par défaut en plus des régions personnalisées, ajoutez-les manuellement.
  • L'ordre dans lequel les régions sont ajoutées est pris en compte dans la page d'administration des blocs. Garland utilise les régions par défaut. Remarquez l'ordre d'affichage des régions dans la page d'administration.
  • Le contenu du fichier .info est mis en cache dans la base de données, sa modification ne sera donc pas remarquée par Drupal (ne pas confondre le cache avec le registre des thèmes http://www.kolossaldrupal.org/docs/la-surcharge-themes#theme-registry).
  • Pour vider le cache, faites l'une des opérations suivantes :

    • Clic sur le bouton Supprimer les données du cache dans la page Administrer » Configuration du site » Performance
    • Si le bloc Devel est actif (livré avec le module Devel), cliquez sur le lien Vider le cache.
    • Ou affichez simplement la page de sélection de thèmes dans Administrer » Construction du site » Thèmes.

Informations de mises à jour :

  • Dans Drupal 7, ces variables sont nommées $sidebar_first et $sidebar_second.
  • La variable région $footer_message a été supprimée dans Drupal 7
regions[first] = Sidebar first
regions[second] = Sidebar second

La région $content

Dans Drupal 6 et avant, la variable $content de page.tpl.php contenait le contenu principal de la page avec les blocs positionnés dans la region contenu (si cette region était déclarée).

Dans Drupal 7, $content est devenu une région à part entière et est désormais obligatoire dans tous les thèmes. Cette nouvelle exigence a été mise en place pour que lorsqu'on active des nouveaux thèmes, Drupal sache où mettre le contenu principal de la page.

Dans Drupal 6, il n'était possible que de mettre les blocs après le contenu principal de la page dans cette région. La seule façon de mettre les blocs avant le contenu principal de la page était de déclarer une région spécifique à cette fin. Drupal 7 crée maintenant son propre bloc pour le contenu principal de la page. Il est ainsi possible de mettre des blocs avant ou après le contenu principal de la page dans la region sans avoir à hacker une nouvelle région.

Attribuer manuellement un contenu aux régions

Un contenu peut être manuellement placé dans une région avec drupal_set_content (http://api.drupal.org/api/function/drupal_set_content). Par exemple : drupal_set_content('header', 'Bienvenue !') affectera le texte « Bienvenue ! » à la région Header.

Voici un exemple plus utile pour la construction d'un résumé de tous les commentaires dans la région Right. Renommez le préfixe « drop » avec le nom de votre thème. Plus d'informations disponibles sur la page consacrée aux pré-traitements (http://www.kolossaldrupal.org/docs/initialisation-variables-pour-leur-utilisation-dans-gabarit-fonctions-de-pre-traitement)

<?php
function drop_preprocess_comment(&$variables) {
 
  
// Initialiser quelques variables.
  
$comment $variables['comment'];
  
$title l(
    
$comment->subject,
    
comment_node_url(),
    array(
'fragment' => "comment-$comment->cid")
  );
  
$new_marker $comment->new t('new') : '';
  
$by_line t('by') .' 'theme('username'$comment);

  
// Placer le balisage.
  
$summary '<div class="comment-sidebar">';
  
$summary .= '<span class="title">' "$title $new_marker</span>";
  
$summary .= '<span class="credit">' "$by_line</span>"
  
$summary .= '</div>';

  
// Placer le commentaire dans la région droite.
  
drupal_set_content('right'$summary);
}
?>

Notez que la création de contenu par le biais de cette fonction doit se faire avant que les blocs des regions ne soient récupérés, et cela se fait par un appel à template_preprocess_page > theme_blocks > drupal_get_content.

Vérifier si une région est occupée

Traduction de la page http://drupal.org/node/517696
publiée / actualisée le 11 Mars 2011 sur drupal.org


Lorsqu'on personnalise page.tpl.php, il est possible de vérifier si une région est vide, en vérifiant le contenu de la variable correspondante qui contient les contenus de la région.

Par exemple :

Drupal 6

<?php
  
if($left) {
    
// do something
  
}
?>

Drupal 7

<?php
   
if($page['sidebar_first']) {
    
// do something
  
}
?>

Cependant, les variables region n'ont pas été déclarées pour les gabarits au niveau bloc, node et view..

Pour régler cette question, j'ai adapté une partie du code de block.module pour créer une fonction qui peut être insérée dans le fichier template.php de votre thème (c'est l'auteur de l'article original qui parle, pas kolossaldrupal).

La fonction prend un paramètre (un nom de région), et renvoie 1 si la région est vide ou 0 si elle est occupée. La fonction tient compte du path en cours et des paramètres de visibilité des blocs.

<?php
function region_empty($test_region) {
  
/* Vérifie si une région est occupée
   * renvoie 1 si elle est vide
   */

  
$test_empty 1;

  
$result db_query_range('SELECT n.pages, n.visibility FROM {blocks} n WHERE n.region="%s" AND n.theme="%s"'$test_region$GLOBALS['theme'], 010);
  if (
count($result) > 0) {
    while (
$node db_fetch_object($result))
    {

      if (
$node->visibility 2) {
        
$path drupal_get_path_alias($_GET['q']);

        
// Compare avec le chemin interne et l'alias de path  (s'il y en a).
        
$page_match drupal_match_path($path$node->pages);
        if (
$path != $_GET['q']) {
          
$page_match $page_match || drupal_match_path($_GET['q'], $node->pages);
        }
        
// Lorsque $block->visibility a la valeur 0, le bloc est affiché sur 
        // toutes les pages sauf celles répertoriées dans $block->pages. Lorsque la valeur est à 1, il 
        // n'est affiché que dans les pages répertoriées dans $block->pages.
        
$page_match = !($node->visibility xor $page_match);
      } else {
        
$page_match drupal_eval($block->pages);
      }

      if (
$page_match)
        
$test_empty 0;
    }
  }
  return 
$test_empty;
}
?>