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.
Le thème Drupal 7 Bartik dispose des régions par défaut suivantes :
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 :
Pour vider le cache, faites l'une des opérations suivantes :
Informations de mises à jour :
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.
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.
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'], 0, 10);
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;
}
?>