Svilluppare un Modulo

Drupal cerca i moduli da installare nelle directory e sottodirectory:

/modules contiene i moduli di sistema (core)
/sites/all contiene altro tra cui moduli propri.

E’ consigliato creare una sottodirectory per i moduli aggiuntivi.

/sites/all/modules

I file principali del modulo , che devono essere contenuti in /sites/all/modules/miomodulo si devono chiamare :

Tipologia dei moduli

Un modulo può essere di tipo:

Block module

Sono moduli che generalmente vengono posizionati sulle barre laterali. Drupal chiama la funzione miomodulo_block($op=='view') con opzione uguale a view per ottenere il contenuto del blocco. In particolare Drupal si aspetta un array $block di ritorno con i seguenti valori impostati:

$block['subject'] = t('MioModulo');
$block['content'] = contenuto del blocco;

Node module

Sono moduli che generalmente generano pagine di contenuto come blog, forum, book pages.

Le funzioni minime che è bene definire per un modulo sono:

  • miomodulo_block()
  • miomodulo_help()
  • miomodulo_perm()

Hook principali

IN FASE DI REALIZZAZIONE

Elenco degli hook principali

hook_exit

Drupal chiama tutte le funzioni hook_exit() implementate nei moduli attivi, per avvisare che la pagina richiesta è stata inviata e che le operazioni da attivare sono terminate.

L' hook exit può essere utile per eseguire un debugging del sistema o aggiornare, in fase di chiusura della pagina, alcune tabelle associate ai moduli.
Due moduli di sistema che usano questo hook sono:

  • Modulo statistics che esegue le statistiche di accesso al sito.
    Funzione statistics_exit();
  • Modulo throttle che esegue il controllo della congestione del sito.
    Funzione throttle_exit();

hook_load

Drupal chiama tutte le funzioni hook_load() implementate nei moduli attivi, per aggiungere campi non predefiniti nell'oggetto nodo.
Ad esempio una rubrica telefonica può avere campi come indirizzo, telefono etc. con un modulo rubrica che implementa la funzione rubrica_load (&$nodo)

Accesso ai moduli:permessi

Premesso che , l’accesso ad un modulo viene impostato tramite la pagina Gestione utenti->Controlli accessi.

In questa pagina compaiono per ogni modulo i permessi associati ad esso e per ogni permesso a quale ruolo è assegnato il permesso.
I ruoli per default sono due: anonymous user e authenticated user.
E’ possibile aggiungere altri ruoli utilizzando la pagina Gestione utenti->Ruoli.
Detto questo, le descrizione dei permessi che compaiono nella pagina Gestione utenti->Controlli accessi sono definite mediante la funzione:

<?php
function miomodulo_perm()
{
   return array(
               
"amministra contenuti miomodulo",
               
"crea contenuti miomodulo");,
}
?>

Qui sopra sono riportati solo due permessi, ma ovviamente ne potrebbero essere definiti altri. E' bene inserire sempre il nome nel modulo per ogni permesso. In caso contrario Drupal potrebbe assegnare la stringa di permesso a più moduli, creando seri problemi all'impianto di sicurezza.

Per verificare se l’utente corrente ha determinati permessi usare la funzione user_access()

<?php
if (!user_access("amministra contenuti miomodulo")) {
 
$form['error'] = array('#type' => 'item',
    
'#title' => t("Non sei autorizzato ad accedere a miomodulo."));
  return
$form;
}

?>

Versioni precedenti alla 5.0 di Drupal usavano la funzione message_access() ora deprecata.

Messaggi di configurazione del modulo

Pagina dei moduli
Nella pagina dei moduli le descrizioni associate al modulo provengono dal file miomodulo.info contenuto nella directory del modulo. All’interno del file sono contenute almeno le prime due variabili:

$Id$
name = miomodulo
description = "Descrizione MioModulo"
dependencies = modulo1 modulo2 modulo3
package = MieModuli

con i seguenti significati

  • name Nome del modulo
  • description Descrizione del modulo
  • dependencies Indica i moduli da cui il modulo stesso dipende. Drupal non attiverà il modulo finchè non saranno attivi i moduli da cui dipende
  • package Pakage di appartenenza del modulo.Tutti i moduli appartenenti allo stesso package sono mostrati raggruppati nella pagina dei moduli

Pagina dei blocchi
Nome del blocco nella lista blocchi

Funzione miomodulo_block($op=’list’)

Esempio:

<?php
function miomodulo_block($op = 'list', $delta = 0)
{
    if (
$op == "list")
    {
       
$block[0]["info"] = t('MioBlocco');
        return
$block;
    }
}
?>

* Descrizione dell'help all’interno della configurazione del blocco

Funzione miomodulo_help($section = "")

Come definito al paragrafo Accesso ai moduli:permessi, i permessi di accesso ai moduli sono definiti mediante la funzione miomodulo_perm()

<?php
function miomodulo_perm()
{
   return array(
"amministra contenuti miomodulo",
               
"crea contenuti miomodulo");
}
?>

Il valore di $section deve essere verificato posizionando il cursore sul link ‘configura’ della pagina dei blocchi e vedere a quale percorso punta. Generalmente è admin/build/block/configure/MioBlocco/0 e quindi scrivere la funzione miomodulo_help() nel seguente modo:

<?php
function miomodulo_help($section = "")
{
   
$output = "";
    switch (
$section)
    {
        case
"admin/build/block/configure/MioBlocco/0":
            
$output = "<p>" . t("Descrizione di MioBlocco") . "</p>";
             break;
       default:
    }
    return
$output;
}
?>

Pagina del controllo accessi utenti
Come definito al paragrafo Accesso ai moduli:permessi, i permessi di accesso ai moduli sono definiti mediante la funzione miomodulo_perm()

<?php

function miomodulo_perm()
{
   return array(
"amministra contenuti miomodulo",
               
"crea contenuti miomodulo");
}

?>

Style sheet

Quando un modulo ha fogli di stile propri, questi devono essere caricati prima di visualizzare il contenuto della pagina generata dal modulo. Nella pagina HTML generata da Drupal i file di stile compaiono secondo la sequenza:

stile/i del modulo corrente
stile/i del modulo corrente contenuti nel tema corrente
stili di default di Drupal
stili del tema corrente

come di seguito indicato.

<style type="text/css" media="all">@import "/sites/all/modules/miomodulo/miomodulo.css"</style>
<style type="text/css" media="all">@import "/sites/all/themes/miotema/miomodulo.css"</style>

<style type="text/css" media="all">@import "/modules/book/book.css"</style>
<style type="text/css" media="all">@import "/modules/node/node.css"</style>
<style type="text/css" media="all">@import "/modules/system/defaults.css"</style>
<style type="text/css" media="all">@import "/modules/system/system.css"</style>
<style type="text/css" media="all">@import "/modules/user/user.css"</style>
...
<style type="text/css" media="all">@import"/sites/all/themes/miotema/style.css"</style>


Per fare questo è utilizzata la funzione drupal_add_css() secondo il codice riportato.
L'esempio riporta il codice necessario per caricare il foglio di stile miomodulo.css.
Questo codice deve essere chiamato dalle funzioni del modulo che preparano codice HTML.

function miomodulo_css_file() {
       $css_files = array();    // array in cui definire i file css
        // Definisce i percorsi dei file di stile
       $file_css_modulo          = drupal_get_path('module', 'miomodulo') . '/miomodulo.css';
       $file_css_modulo_in tema  = path_to_theme() .  '/miomodulo.css'; // se esistente
       // Definisce nell'array lo stile di default del modulo 
       $css_files[] = array('file' => $file_css_modulo, 'type' => 'module', );
        /* 
       Definisce nell'array lo stile ripetuto nella directory del tema corrente
       Se esiste un file di stile nella directory del tema corrente
       con lo stesso nome dello stile del modulo lo carica. 
       */
       if (file_exists($file_css_modulo_in tema) {
           $css_files[] = array('file' => $file_css_modulo_in tema, 'type' => 'theme', );
       }
       // Avvisa Drupal di caricare i fogli definiti
       foreach ($css_files as $css_file)
       {
           drupal_add_css($css_file['file'], $css_file['type'], 'all', false);
       }
}