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

Référence en anglais sur drupal.org : 5 Août 2009 - 14h30
http://drupal.org/node/517696


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 :

<?php
  
if($left) {
    
// 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;
}
?>