lunedì 3 ottobre 2011

Drupal - Creiamo un modulo

Sinceramente mi sono veramente stancato.
Sono alle prime armi con Drupal 7.X e sulla rete non si trova niente che spiega per bene come creare da zero un beneamato modulo.
Allora ho detto: "Come me ci si troveranno tante altre persone" e quindi mi sono detto "Facciamo che mi smazzo io la ricerca di come si fa e poi sharo queste nozioni alla gente".

Vediamo quindi come creare un modulo da zero per DRUPAL 7.X partendo dalle basi.

NB: In questo BLOG do per scontato che sappiate programmare in PHP.

Creare la directory


Per prima cosa dobbiamo creare la directory del nostro modulo che sarà anche il nome del modulo stesso. E' una scelta fondamentale di peso.
Nel mio esempio voglio un modulo per creare un PNG per il GDR Pathfinder.

Nella vostra installazione di DRUPAL andate in sites/all/modules e create la vostra directory. Nel mio pcaso png_creator.

Dentro iniziamo a crearci due file:

png_creator.info
png_creator.module

Istruite la vostra IDE per riconoscere il .module come file di PHP. Trovate su google come fare.

Riempire il .info


Il .info dice a Drupal com'è fatto il vostro modulo.


name = PNG Cretgor
description = Modulo per la creazione di un PNG
package = Pathfinder
version = "0.1"
core = 7.x
files[] = png_creator.test

Alcuni campi sono ovvi. Il package rappresenta come in Java un nome nella quale potete raggruppare i vostri moduli. In questo modo avrete un insieme di moduli comunicanti.
Core rappresenta la versione di Drupal necessasria mentre files[] rappresenta l'elenco dei file usati dal modulo. Per adesso abbiamo solo png_creator.test (istruite la vostra IDE per riconoscerlo come .php).

Quella cosa degli Hook


Se avete bazzicato la rete nel tentativo inutile di trovare qualche tutorial, avrete sicuramente visto citare più volte questa parola ovvero hook. Come suggerisce la parola, hook significa "gancio" che altro non è che il modo elegante che ha Drupal per dire che le cose occorre scriverle come dice lui. Se non usi gli hook sei uno sfigate e le chiacchierete stanno a zero.


Drupal fornisce una comoda lista di hook che lui riconosce. Potete spaventarvi a questo indirizzo: LISTA DI QUEI DUE O TRE HOOK.


Se li usi sei DIO. Se non li usi non sei nessuno.

Vogliamo quel "Hello World", per Dio!


A questo punto abbiamo tutto quello che ci serve per poter creare il nostro Hello World preferito che ovviamente non è così semplice da fare come fare echo "Hello World".

Apriamo quindi il nostro png_creator.module


<?php

    function png_creator_block_info() {
      $blocks['hello_world'] = array(
        'info' => t('Blocco Hello World'), 
        'cache' => DRUPAL_CACHE_PER_ROLE,
      );
      return $blocks;
    }

?>

Qui useremo il primo hook ovvero _block_info(). Sui blocchi esistono vari Hook, questo è il più importante perché qui elencherete tutti i blocchi di codice che il vostro modulo costruisce.
Nel nostro caso ne creiamo uno solo chiamato Blocco Hello World che avrà associato il nome hello_world.
In pratica è una matrice con dentro delle informazioni. Quella costante DRUPAL_CACHE_PER_ROLE indica se e come il blocco va cachato.

Dato che mi aspetto che sappiate l'inglese, vi riporto le possibilità:


  • DRUPAL_CACHE_PER_ROLE (default): The block can change depending on the roles the user viewing the page belongs to.
  • DRUPAL_CACHE_PER_USER: The block can change depending on the user viewing the page. This setting can be resource-consuming for sites with large number of users, and should only be used when DRUPAL_CACHE_PER_ROLE is not sufficient.
  • DRUPAL_CACHE_PER_PAGE: The block can change depending on the page being viewed.
  • DRUPAL_CACHE_GLOBAL: The block is the same for every user on every page where it is visible.
  • DRUPAL_NO_CACHE: The block should not get cached.

Ancora molto per quel "Hello World"?

Ci siamo quasi. Abbiamo detto a DRUPAL che creiamo un blocco, ora occorre dirgli cosa ci mettiamo dentro. Una echo sarebbe stata troppo banale ovviamente e a dire il vero sarebbe stata una delusione se avessi potuto fare echo direttamente qui nel codice. Teoricamente un modulo si occupa della logica e basta.



<?php

    function png_creator_block_info() {
      $blocks['hello_world'] = array(
        'info' => t('Blocco Hello World'), //The name that will appear in the block list.
        'cache' => DRUPAL_CACHE_PER_ROLE, //Default
      );
      return $blocks;
    }

    function png_creator_hello_world(){
          return 'Hello World';  
    }
    
    function png_creator_block_view($delta = '') {
      switch($delta){
        case 'hello_world':
          $block['subject'] = t('Titolo del blocco');
          if(user_access('access content')){
            $block['content'] = png_creator_hello_world();
          }
          break;
      }
      return $block;
   }    
    
?>

Eccoci arrivati quasi alla fine. Il codice sopra è abbastanza ovvio.
Abbiamo creato una funzione png_creator_hello_world (no, questa volta non è un hook) ed abbiamo detto di ritornare Hello World. In un futuro fotonico, qui faremo qualche operazione logica per la quale valga la pena scrivere del codice.

La funzione sotto è invece un hook chiamato _block_view il cui parametro in ingresso è dato direttamente da DRUPAL e le sue origini non vogliamo saperlo. In realtà è il famoso LABEL che indica quale blocco il sito ha bisogno di visualizzare. Il nostro switch avrà una sola voce visto che abbiamo creato un solo blocco.
Il blocco ha bisogno di ritornare un array riempito in un certo modo. Di base gli serve un titolo ed un contenuto.
Se vi state chiedendo cosa è quella funzione t() sappiate che in DRUPAL stampare qualcosa passa da questa funzione se volete supportare il multilingua (cosa in effetti gradita). Questo significa che Hello World sarà stampato così per tutti ma non il titolo del blocchetto.

Installiamo il modulo su DRUPAL


Abbiamo quello che ci serve per installare il modulo. Andre nel vostro DRUPAL nella sezione MODULI ed in basso avrete un blocco graficamente ben fatto con il nome PATHFINDER (o il package che avete scritto) e sotto il vostro bel modulo (nel nostro caso PNG Creator).


Attiviamolo con il check e poi andiamo su SALVA CONFIGURAZIONE. Adesso DRUPAL fagociterà il nostro blocchetto nella lista dei blocchi.


Andate quindi in STRUTTURA e quindi BLOCCHI. Il vostro blocco sarà in fondo. Scegliete un posto nella struttua del sito dove metterlo semplicemente selezionandolo dal menù a tendina. 


Salvate ed il gioco è fatto. Se lo mettete in CONTENUTO lo avrete nella parte principale del sito.

2 commenti:

  1. Ciao grazie mille per la condivisione, hai fatto esattamente il mio stesso ragionamento! :)

    RispondiElimina
  2. Bel Tip! Anche io faccio parte della "setta dei ricercatori dell'occulto" e nelle mie ricerche ho letto che è sconsigliabile l'utilizzo del tag di chiusura '?>' nei files del modulo che fanno uso di PHP. Inoltre è importante sottolineare che i nomi delle funzioni devono essere sempre a caratteri minuscoli (sempre per via degli standard coding Drupal). Se pubblicherai altro ne sarò felice :) Grazie ancora!

    RispondiElimina