Magento deve il suo successo, tra le altre sue caratteristiche e punti di forza, alla sua architettura modulare, che lo rende quindi facilmente estendibile. Ogni concetto funzionale è salvato in un modulo e aggiungerne di nuovi al sistema di base diventa un’attività relativamente facile. Con l’aggiunta di plugin viene messa a disposizione per gli sviluppatori la possibilità di estendere i servizi offerti o di rielaborare e ridisegnare, quelli esistenti.
Ma com’è possibile creare un modulo in Magento?
Proviamo a spiegarlo in questo articolo dove vengono mostrati i vari passi da compiere per sviluppare un semplice modulo che banalmente stampa su una pagina del nostro sito la frase “Ciao Mondo!”.
Il primo passaggio da effettuare per implementare un modulo è la generazione di file e di cartelle che permettono la registrazione del modulo stesso all’interno dell’ecosistema Magento.
Supponendo come vendor ‘WaPoNe’ e nome del modulo ‘Helloworld’, vediamo cosa occorre fare per registrare la nostra estensione:
1. All’interno del percorso <base_dir> /app/code/local/ aggiungiamo una nuova cartella con il nome del vendor, quindi WaPoNe/, poi al suo interno una nuova directory con il nome del modulo (in un’istanza di Magento potrebbe capitare di avere più moduli dello stesso vendor), quindi Helloworld/, ed infine, all’interno di quest’ultima, creiamo la cartella etc/
<base_dir>è la cartella di installazione di Magento.
Al termine dell’operazione descritta avremo quindi questa alberatura nel nostro file system:<base_dir>/app/code/local/WaPoNe/Helloworld/etc/
2. Generiamo il file WaPoNe_Helloworld.xml (seguendo la nomenclatura di Magento, vendorName + ‘_’ + moduleName) nella cartella<base_dir>/app/etc/modules/
<?xml version="1.0" encoding="UTF-8"?> <config> <modules> <WaPoNe_Helloworld> <active>true</active> <codePool>local</codePool> </WaPoNe_Helloworld> </modules> </config>
3. Nella cartella <base_dir>/app/code/local/WaPoNe/Helloworld/etc/ prepariamo il file config.xml così fatto:
<?xml version="1.0" encoding="UTF-8"?> <config> <modules> <WaPoNe_Helloworld> <version>1.0.0</version> </WaPoNe_Helloworld> </modules> </config>
Con queste semplici operazioni, abbiamo registrato il nostro modulo e possiamo controllare il buon esito dell’operazione, andando nel backend del nostro sito, pulendo la cache di Magento e navigando in System > Configuration > Advanced; se tutto è andato bene, il nostro modulo risulta essere presente e abilitato (true in WaPoNe_Helloworld.xml) nella lista dei moduli registrati.
Analizzando velocemente i due file di configurazione del modulo, è molto importante fare attenzione al tag <codePool> del file WaPoNe_Helloworld.xml
Magento gestisce tre ‘code pool’:
- core: il ‘core pool’ contiene i moduli e le classi del core di Magento;
- community: il ‘community pool’ è invece dedicato ai moduli rilasciati dalla community o dai vendor;
- local: tutti i moduli ‘custom’ e sviluppati per l’istanza corrente del sito vanno collocati nel ‘local pool’.
Per il nostro plugin, seguendo le indicazioni appena elencate, abbiamo quindi impostato local come ‘code pool’.
E’ interessante sapere che, durante il caricamento del codice, Magento cerca i moduli prima nel ‘local pool’, successivamente nel ‘community pool’ ed infine nel ‘core pool’.
Complimenti!
Abbiamo realizzato il nostro primo modulo Magento.
Ma questo modulo non implementa alcuna funzionalità!?!? ..non fa nulla!?!?
Giusto, così com’è fatto, il nostro ‘Helloworld’ non fa nulla.
Proviamo allora ad aggiungere una nuova pagina al nostro sito Magento e a stampare in essa qualcosa.
Per fare questo è necessario generare un controller (di frontend) che contiene la action dedita alla gestione della richiesta ricevuta.
Dichiariamo il controller nel file di configurazione del modulo; aggiungiamo quindi il seguente pezzo di codice all’interno del tag <config> allo stesso livello, e subito dopo, del tag <modules> del file <base_dir>/app/code/local/WaPoNe/Helloworld/etc/config.xml
<frontend> <routers> <helloworld> <use>standard</use> <args> <module>WaPoNe_Helloworld</module> <frontName>helloworld</frontName> </args> </helloworld> </routers> </frontend>
All’interno della cartella <base_dir>/app/code/local/WaPoNe/Helloworld/ inseriamo una nuova directory con il nome controllers/ (si, con la ‘c’ minuscola e la ‘s’ finale) contenente il file IndexController.php , composto dalle seguenti righe di codice:
<?php class WaPoNe_Helloworld_IndexController extends Mage_Core_Controller_Front_Action { public function indexAction() { echo 'Hello World!'; } }
Puliamo nuovamente la cache e testiamo il funzionamento del controller chiamandolo all’indirizzo web: http://nomesito.estensione/helloworld/index/index o più semplicemente http://nomesito.estensione/helloworld
Il risultato è una pagina bianca con la frase: “Hello World!”.
Ma se volessimo associare lo stile utilizzato nell’intero portale web anche a questa pagina?
Semplicemente occorre invocare i metodi $this->loadLayout() e $this->renderLayout() che si occupano di far partire il sistema di layout di Magento, che invoca le istruzioni necessarie a caricare la giusta grafica.
Se ci soffermiamo un attimo ad analizzare la sintassi del controller Magento notiamo che è così formata: <moduleName o frontName>/<controllerName>/<actionName>
Nel nostro caso il frontname è helloworld (<frontName>helloworld</frontName> nel config.xml), il nome del controller è index e il nome della action è index.
Magento riconosce i file che fungono da controller quando il nome della classe termina con la parola ‘Controller’; per questo motivo il nome della nostra classe del controller è ‘IndexController’.
La stessa regola è applicata per le action; il nome della funzione deve terminare con la parola ‘Action’. La parte che precede ‘Action’ è il nome della action.
Proviamo allora ad aggiungere un nuovo controller che chiamiamo NewController.php che questa volta carica anche il layout e che deve essere posizionato, come abbiamo già visto, nella cartella <base_dir>/app/code/local/WaPoNe/Helloworld/controllers/
<?php class WaPoNe_Helloworld_NewController extends Mage_Core_Controller_Front_Action { public function helloAction() { echo 'Hello World from the New Controller!'; $this->loadLayout(); $this->renderLayout(); } }
Apriamo ora il nostro browser preferito ed inseriamo http://nomesito.estensione/helloworld nella barra degli indirizzi. Nessuna modifica alla pagina web precedentemente creata che continua ad essere raggiungibile tramite il controller ‘Index’.
Per raggiungere il nuovo controller ‘New’ dobbiamo invece digitare quest’altro indirizzo web: http://nomesito.estensione/helloworld/new/hello
In base alla sintassi prima descritta abbiamo sempre helloworld come frontname, il controller è new e la action hello.
Questa volta la scritta ‘Hello World from the New Controller!’ viene visualizzata in alto nella pagina assieme al layout del sito.
Conclusione
In questo articolo abbiamo mostrato come implementare un semplice modulo Magento. Ho tralasciato volutamente argomenti più complessi dello sviluppo di estensioni che riguardano entità quali blocks, helpers, models e tutta la parte dedicata al design e alle traduzioni del modulo stesso. Questo perché volevo offrire un punto di partenza per approfondimenti su questa tematica molto strategica, nell’universo Magento.