Utente: Anonymous

Blocchi

Gli argomenti trattati fanno riferimento alla versione 6.x di Drupal

Fanno parte dei blocchi, oltre ai blocchi stessi, anche i menu, i commenti, gli utenti, le categorie etc.
Tutti i blocchi condividono la tabella BLOCKS su cui il sistema salva informazioni di carattere generale. I contenuti sono invece salvati in tabella specifiche per ciascun tipologia di blocco.

Le funzioni principali

Riporto, per comodità, le principali funzioni che sono implicate nel processo di lettura e visualizzazione del contenuto dei blocchi.

- template_preprocess_page(&$variables)
La funzione template_preprocess_page(), contenuta in includes/theme.inc, viene chiamata da theme('page') ed è la funzione che avvia il processo di lettura dei blocchi utilizzando le successive funzioni.

- theme_blocks($region)
La funzione theme_blocks($region) legge tuttii blocchi da visualizzare e contenuti nella regione identificata da $region.
Torna una stringa stampabile su web contenente tutto il codice HTML della regione richiesta.
Il contenuto della regione è inserito in $variables[$region] per essere utilizzato da page.tpl.php.
Le regioni generalmente sono:$left,$right,$header,$footer,$content.

- theme_block('view',$block)
La funzione theme_block('view',$block) formatta il contenuto $block->content chiamando il file template block.tpl.php. Può essere creata una funzione utente definendo la miotema_block() o phptemplate_block().
Torna una stringa stampabile su web contenente il codice HTML del contenuto $block->content.

- block_list($region)
La funzione block_list($region) legge le informazioni ed il contenuto dei blocchi da visualizzare nella pagina richiesta e nella regione identificata da $region.
Torna un oggetto $block per ogni blocco letto. Questo oggetto è utilizzato dal file template block.tpl.php.

La selezione dei blocchi

Quando viene richiesta la visualizzazione di una qualsiasi pagina, Drupal carica per prima cosa il file index.php. All'interno di questo file viene chiamata la funzione theme() a cui è passato il paramentro 'page' . Con questo parametro la funzione theme() chiamerà la funzione template_preprocess_page.
All'interno di essa è contenuto il seguente codice:

<?php
 
  
............................................

  global

$theme;
 
// Populate all block regions.
 
$regions = system_region_list($theme);
 
// Load all region content assigned via blocks.
 
foreach (array_keys($regions) as $region) {
     
// Prevent left and right regions from rendering blocks
       
when 'show_blocks' == FALSE.
      if (!(!
$variables['show_blocks'
                               && (
$region == 'left' || $region == 'right'))) {
     
$blocks = theme('blocks', $region);
    }
    else {
      
$blocks = '';
    }
   
// Assign region to a region variable.
   
isset($variables[$region])
                      ?
$variables[$region] .= $blocks
                     
: $variables[$region] = $blocks;
  }
.........................
?>

La system_region_list legge le regioni del tema corrente e, nel successivo cilclo, per ciascuna di esse, la funzione theme('blocks', $region) legge il contenuto dei blocchi appartenenti alla regione indicata e lo pone nella variabile $variables[$region] che sarà successivamente utilizzata dal file template del tema: page.tpl.php.

Sappiamo che chiamare la funzione theme('blocks', $region) equivale a chiamare la funzione theme_blocks($region) implementata nel modulo includes/theme.inc e di seguito riportata.

<?php
function theme_blocks($region) {
 
$output = '';

  if (

$list = block_list($region)) {

    foreach (

$list as $key => $block) {
     
// $key == <i>module</i>_<i>delta</i>
     
$output .= theme('block', $block);
    }
  }
?>

In theme_blocks() sono presenti le due funzioni responsabili della lettura e visualizzazione dei blocchi:

La prima estrae dal database i contenuti da visualizzare insieme ad altre informazioni relative ai blocchi.
La seconda incapsula il contenuto ($block->content) in codice HTML secondo quanto definito nei file di template del tema corrente block.tpl.php o in altri definiti dall'utente.

Query di selezione dei blocchi

Il contenuto dei blocchi da visualizzare sulla pagina è individuato all'interno della funzione block_list() mediante l'esecuzione della seguente query di selezione:

SELECT DISTINCT b.* FROM blocks b
         LEFT JOIN blocks_roles r ON b.module = r.module AND b.delta = r.delta
         WHERE b.theme = '<nome tema corrente>'
                      AND b.status = 1
                     AND (r.rid IN ( <elenco dei ruoli dell'utente corrente>  ) OR r.rid IS NULL)
          ORDER BY b.region, b.weight, b.module

Da questa query vediamo che un blocco per essere selezionato deve:

  • essere abilitato (status=1)
  • appartenere al tema corrente in uso
  • essere visualizzabile da un utente che ha i ruoli indicati in <elenco dei ruoli dell'utente corrente&gt oppure essere visualizzabile da chiunque (r.rid IS NULL)

Da quanto detto si capisce perchè, cambiando tema o utente certe volte non vengono visualizzati alcuni blocchi.

Il contenuto dei blocchi

Abbiamo visto che la funzione block_list() è chiamata nel seguente modo: $list = block_list($region)
Il valore di ritorno $list è un array associativa i cui elementi sono così formati:

$block= $list["modulo_delta"] = oggetto

dove:

  • "modulo_delta" è una stringa in cui "modulo" è il nome del modulo che gestisce il blocco e "delta" il valore del campo delta della tabella BLOCKS.
  • $block è invece un variabile di tipo Object contenente le informazioni sul blocco letto:
$block->bid da tabella BLOCKS
$block->module da tabella BLOCKS
$block->delta da tabella BLOCKS
$block->theme da tabella BLOCKS
$block->status da tabella BLOCKS
$block->weight da tabella BLOCKS
$block->region da tabella BLOCKS
$block->custom da tabella BLOCKS
$block->throttle da tabella BLOCKS
$block->visibility da tabella BLOCKS
$block->pages da tabella BLOCKS
$block->title da tabella BLOCKS
$block->cache da tabella BLOCKS
$block->content contenuto del blocco (per un blocco , il contenuto di body)
$block->subject titolo da visualizzare nella pagina
$block->enabled VERO/FALSO (indica se il blocco è abilitato ad essere visualizzato)
$block->page_match VERO/FALSO (indica se il blocco può essere visualizzato)

Queste informazioni sono disponibili in fase di lettura del file template block.tpl.php.

Le tabelle dei contenuti
L'oggetto precedente contiene il valore $block->content che rappresenta il vero contenuto del blocco, ciò che è stato effettivamente inserito come informazione del blocco.
Questa informazione non è contenuta nella tabella BLOCKS ma nelle tabelle relative alla tipologia del blocco.
Ad esempio, per i principali moduli:

  • modulo block => tabella BOXES
  • modulo menu => tabella MENU_LINKS (ed altro)
  • modulo comment => tabella COMMENTS
  • modulo users => tabella USERS

Per moduli non di sistema, potranno esserci altre tabelle di contenuto.

Le funzioni di lettura dei contenuti
Il contenuto del blocco è letto dalla funzione di gestione del modulo: nomemodulo_block().
La funzione di lettura dei contenuti del blocco è chiamata all'interno di block_list() mediante la funzione:
module_invoke($block->module, 'block', 'view', $block->delta).
Per i blocchi precedentemente indicati, il contenuto sarà letto da:

  • modulo block => block_block('view', $blocks->delta)
  • modulo menu => menu_block('view', $blocks->delta)
  • modulo comment => comment_block('view', $blocks->delta)
  • modulo users => user_block('view', $blocks->delta)

In generale , per moduli non di sistema , Drupal chiamerà la funzione nomemodulo_block('view', $blocks).