[D5-HOWTO-Beta] Inserimento manuale di un blocco in un file template

2 contenuti / 0 new
Ultimo contenuto
[D5-HOWTO-Beta] Inserimento manuale di un blocco in un file template

OGGETTO
Inserimento di un blocco all'interno di una pagina utilizzando i file di template.
DESCRIZIONE
Il seguente HOWTO permette di realizzare un modulo base (che più base non si può) con all'interno un blocco che elenca gli utenti attivi iscritti al portale di drupal e successivamente caricare il modulo all'interno di un file template utilizzando la funzione module_invoke()

HOWTO
Per prima cosa creiamo un modulo - che chiameremo lista_utenti - che ad esempio ci restituisca l'elenco di tutti gli utenti attivi iscritti al sito:

1)Creiamo quindi il file lista_utenti.info:

; $Id$
name = lista_utenti
description = Blocco per visualizzare gli utenti registrati al portale.
package = Aran
version = "1.0"

2)Creiamo il file lista_utenti.install
NOTA in questo caso non serve a nulla, perchè non andiamo a creare alcuna tabella aggiuntiva nel DB, ma comunque è bene crearlo per eventuali modifiche successive

<?php
function lista_utenti_install()
  {
   
drupal_set_message(t('Avvio installazione del modulo lista_utenti'));
    switch(
$GLOBALS['db_type'])
    {
        case
'mysqli':
        case
'mysql':
           
$success = TRUE;
        break;
        default:
           
drupal_set_message(t('Attenzione, DB non supportato.'));
        break;
    }
    if (
$success)
    {
       
drupal_set_message(t('Module lista_utenti installato nel con successo.'));
    }
    else
    {
       
drupal_set_message(t('L\'installazione del modulo  non &egrave;  andata a buon fine.'));
    }
}
/**
* Implementation of hook_uninstall().
*/
function lista_utenti_uninstall()
{
   
drupal_set_message(t('La disinstallazione del modulo   &egrave; andata a buon fine.'));
}
?>

3)Creiamo il file lista_utenti.module
NOTA: per mia convenzione raggruppo le funzioni che creo per tipologia e le inserisco in file differenti, questo per non avere un unico file da 40000 righe e non capirci più nulla; basta solo ricordarsi di includere i file all'interno del file .module che si crea.
Questa è una mia convenzione, poi ognuno è libero di fare come crede.
In ogni caso proseguiamo con lista_utenti.module: in queesto caso la funzione hook_menu() sarà vuota, perchè non abbiamo bisogno di specificare alcun path, visto che la funzione hook_block è già prevista nella programmazione dei moduli di drupal.
Il nostro file quindi risulterà così:

    <?php
       
include_once (blocco.php);
        function
lista_utenti_menu($may_cache)
        {
           
$items = array();
            return
$items;
        }
   
?>

Adesso creiamo il file blocco.php in cui inseriremo il nostro blocco da visualizzare:

    <?php
       
function lista_utenti_block($op = 'list',$delta = 0, $edit = array() )
        {
           switch(
$op)
           {
               case
'list':
                  
$blocks[0]['info'] = t('Blocco lista utenti');
                  
$blocks[0]['custom'] = FALSE;
               return
$blocks;
               case
'view':
                  
//se avete bisogno di un css per il blocco inseritelo in questa maniera:
                  
drupal_add_css( drupal_get_path('module','lista_utenti').'/css/lista_utenti.css');
                   if(
$delta == 0)
                   {
                      
$query = "SELECT name FROM {users} where status = %d;";
                      
//lo stato di un utente è dato dal valore 1 nel campo status: 1 attivo,0 bloccato
                      
$result = db_query($query,1);
                      
$block['content'] = '<table class="tabella_lista_utenti">';
                       while(
$data = db_fetch_object($result))
                       {
                              
$block['content'] .= '<tr><td>'.$data->name.'</td></tr>';
                       }
                      
$block['content'] .= '</table>';
                   }
               return
$block;
           }
        }
   
?>

CSS
Nel nostro esempio ci serve un foglio di stile per definire la classe tabella_lista_utenti; creiamo quindi una cartella di nome css all'interno del modulo e creiamo all'interno un file di nome lista_utenti.css dove andremo ad inserire il nostro CSS personalizzato per il blocco.

Adesso è tutto pronto: carichiamo il nostro modulo nella cartella sites/all/modules, lo attiviamo e troveremo il nostro blocco all'interno del menu admin nella sezione "Blocks".
Adesso mettiamo il caso che dobbiate fa vedere questa lista nella home-page del Vostro sito; basterà adesso richiamare il blocco all'interno del tema front-page.tpl.php situato nella cartella del vostro tema utilizzato.
Per richiamare il blocco sarà sufficiente inserire il seguente codice nella giusta posizione (la posizione dipenderà da dove volete inserire il blocco):


<?php
    $block
= module_invoke(’lista_utenti’, ‘block’, ‘view’, 1);
    print
$block['content'];
?>

dove:
lista_utenti : nome del modulo
block : richiama la funzione lista_utenti_block
view: è il valore da dare a $op all'interno della funzione lista_utenti_block
1: è il valore da assegnare alla variabile $delta

La variabile $delta è molto utile perchè si possono realizzare anche 50 blocchi all'interno della funzione lista_utenti_block ed assegnare ad ognuno un valore di delta differente.
Successivamente si potrà richiamare un blocco invece di un altro semplicemente cambiando il valore del $delta al momento della chiamata della module_invoke

Qualche dubbio...
[Rant]Insisto (proprio per l'ultima volta) sul formattazione del codice, che non segue la dottrina Drupal - usi Coder? O è stile Aran? Anche package = Aran (ancora). Così sulla lista moduli ci sarà un fieldset 'Aran'. Sigh [/Rant] Okay, ho finito.

Quote:
NOTA: per mia convenzione raggruppo le funzioni che creo per tipologia e le inserisco in file differenti, questo per non avere un unico file da 40000 righe e non capirci più nulla; basta solo ricordarsi di includere i file all'interno del file .module che si crea.

Il file xxx.module è molto speciale, perchè contiene gli hooks. Se implementi uno solo hook, Drupal caricerà sempre quel file. Ogni volta. Per sempre. Giorno e notte...
Nei moduli che ho visto io, vedo che contengono quasi sempre solo gli hooks e qualche funzione aiutante per gli hooks. I callbacks per menu items ecc, sono quasi sempre definiti in altri file. Infatti la struttura dati dei callbacks permette di specificare un'altro file apposta, anche per ridurre il carico. Può darsi per D5 non era così, ma lo è per D6, e forse D7. Tu rischi di stracaricare Drupal di files che non verranno (sempre) usati (tipo il UI admin), o no?

Nella funziona lista_utenti_block testi per $delta == 0 per reimpire $block['content'], ma nel snippet da inserire nel template dici di mettere il valore di $delta = 1. Un errore di sbaglio, forse?

Ho i dubbi nel usare il button PHP invece di CODE per snippets di codice da un file, se non bisogna ricordare il lettore di togliere gli <?php e ?>. Ovvio che però con CODE perdiamo il syntax highlighting.

Perchè non aggiungere un file esempio? Attenzione però bisogna copiarlo da esempio.php in esempio.php.txt se no non viene caricato - ci sono cascato un paio di ore fa...

Più imparo, più dubito.