Home>Guide>Come creare un modulo per Magento

Come creare un modulo per Magento


Come creare un modulo per Magento


Magento è già di per sé un CMS molto potente e completo, ma come sempre quando si parla di software, può nascere l’esigenza di estenderne le capacità per aggiungere una o più funzionalità non previste dalla versione di default. Se non sai da dove partire, questa guida è pensata appositamente per te.

  • Leggi l'articolo, ti bastano solo 2 minuti, 29 secondi
    Sei di fretta? Scarica il PDF e consultalo quando vuoi!
La guida fa riferimento alle versioni 1.9.x di Magento, precedenti rispetto all'attuale v2.x.x.

Il progetto: cosa realizziamo?

Per spiegarti come realizzare un modulo personalizzato per Magento, prenderemo in esempio un progetto piuttosto banale. Ipotizza di voler annotare in un file di log ogni modifica apportata ai prodotti del tuo e-commerce, per tenere traccia dei cambiamenti che avvengono nel tuo shop.


Il progetto: come lo realizziamo?

Per ottenere quanto descritto, c’è bisogno che io ti annoi con un po’ di teoria. Lo so che a nessuno piace, ma è necessario, sii paziente.

Magento utilizza un sistema di estensione molto utile agli sviluppatori per iniettare del codice che alteri il risultato di alcune funzioni di Magento stesso senza modificarne i files. Com’è possibile?
La magia è operata dal pattern Event Observer. Un Observer è una classe i cui metodi vengono dichiarati “in ascolto” sulle funzioni di default di Magento. Ogni qual volta una di queste funzioni di default viene richiamata ed eseguita, il codice del metodo Observer agganciato alla funzione viene a sua volta eseguito.
Nel nostro caso, equivale a dire:

Esiste una funzione nel core di Magento che esegue l’update dei prodotti sul db ogni volta che l’utente clicca sul pulsante “Aggiorna”. Quando questa funzione viene richiamata, esegui il metodo dell’Observer agganciato su di essa


Prepariamo il terreno

Prima di iniziare, considera un aspetto fondamentale. È necessario che la cache di Magento sia disabilitata, così da non incorrere in problemi di lettura dei files giusti. Se non sai come fare, vai su:

Sistema > Gestione della Cache

clicca sul pulsante in alto a sinistra:

SELEZIONA TUTTO

e poi a destra, nel menu a tendina “Azioni”, scegli:

DISABILITA

ed infine clicca su:

INVIA

Fatto?

Il minimo sindacale c’è, ma la dritta che posso darti, per agevolarti nel lavoro, è di cambiare qualche impostazione di Magento… Se ti va di accettare qualche suggerimento, leggi l’articolo:



Creiamo le cartelle

La prima cosa da fare, è creare le cartelle che ospiteranno i files del tuo modulo. Se non sai ancora come fare o se hai le idee confuse su come sono strutturate le directory di Magento, ti consiglio di dare una rinfrescata leggendo l’articolo Il filesystem di Magento.

Ora che è tutto più chiaro, possiamo stabilire il nome del Vendor (supponiamo Code4Life) ed il nome del Modulo (supponiamo ProductUpdateHistory).

Procedi quindi col creare all’interno della cartella:

app/code/local/

una cartella chiamata Code4Life ed al suo interno una ulteriore cartella chiamata ProductUpdateHistory ed ancora al suo interno, la cartella etc, ottenendo il seguente percorso:

app/code/local/Code4Life/ProductUpdateHistory/etc/

Queste sono le cartelle che conterranno i files necessari allo sviluppo del tuo primo modulo per Magento.
All’interno del percorso appena creato, inserisci il file di configurazione config.xml:

app/code/local/Code4Life/ProductUpdateHistory/etc/config.xml

al cui interno scriverai:

<?xml version="1.0" encoding="UTF-8"?>
<config>
	<modules>
		<Code4Life_ProductUpdateHistory>
			<version>1.0.0</version>
		</Code4Life_ProductUpdateHistory>
	</modules>
</config>

Il file di configurazione, non fa altro che comunicare a Magento alcuni dati inerenti il modulo, come ad esempio la versione e il path secondo la nomenclatura di Magento:

NomeVendor + ‘_’ + NomeModulo

Fin qui tutto semplice, no? Ma aspetta un attimo… come fa Magento a capire che esiste un modulo nuovo da caricare?
Giusta osservazione. Ed in effetti c’è bisogno di comunicarglielo! Per farlo, portati nella cartella

app/etc/modules/

e crea il file Code4Life_ProductUpdateHistory.xml, che rispetta sempre la nomenclatura NomeVendor + ‘_’ + NomeModulo ed al suo interno scrivi:

<?xml version="1.0" encoding="UTF-8"?>
<config>
	<modules>
		<Code4Life_ProductUpdateHistory>
			<active>true</active>
			<codePool>local</codePool>
		</Code4Life_ProductUpdateHistory>
	</modules>
</config>

La cartella:

app/etc/modules/

contiene i files relativi ai moduli di Magento, il path in cui trovare i file che li compongono ed il flag di attivazione. È a questo punto che Magento è cosciente dell’esistenza del tuo modulo! Non ci credi? Entra nel backend del tuo Magento e vai su:

Sistema > Configurazione > Avanzate

e nell’unica tab presente (vale a dire: “Disabilita output dei moduli”) troverai:

Code4Life_ProductUpdateHistory

Ecco, è in questo preciso istante che puoi urlare al mondo “Ho realizzato il mio primo modulo per Magento!!”.
Dì la verità, non senti il tuo orgoglio crescere almeno un po’? Sono sicuro di sì, ma non è finita!

Il modulo esiste, Magento ne riconosce l’esistenza, ma bisogna programmarlo per quello che deve realmente fare: scrivere un file di log ad ogni aggiornamento di prodotto, intercettando la funzione di default di Magento che gestisce l’update.


L'Event Observer

Bene, recuperiamo la concentrazione.
Abbiamo anticipato che dovrai cercare la funzione che si occupa di effettuare l’update dei prodotti. Per questa volta, ti aiuto io. L’evento a cui ti aggancerai è:

catalog_product_save_after

Riprendiamo adesso il file:

app/code/local/Code4Life/ProductUpdateHistory/etc/config.xml

precedentemente scritto ed aggiungiamo le righe necessarie a dichiarare l’Event Observer. Per completezza, ti riporto direttamente il file completo, evidenziando le righe aggiunte:

<?xml version="1.0" encoding="UTF-8"?>
<config>
	<modules>
		<Code4Life_ProductUpdateHistory>
			<version>1.0.0</version>
		</Code4Life_ProductUpdateHistory>
	</modules>
	<global>
		<events>
			<catalog_product_save_after>
				<observers>
					<code4life_productupdatehistory>
						<class>code4life_productupdatehistory/observer</class>
						<method>writeLogOnProductUpdate</method>
						<type>singleton</type>
					</code4life_productupdatehistory>
				</observers>
			</catalog_product_save_after>
		</events>
	</global>
</config>

Fermi tutti, facciamo un po’ di chiarezza.

  • Riga 8: Definisce il campo di applicazione del comportamento del modulo, <global> indica appunto globale
  • Riga 9: Indica che stiamo per definire un Event Observer
  • Riga 10: Stabilisce su quale evento di Magento vogliamo mettere in ascolto il nostro Observer
  • Riga 11: Inizializza l’Observer per l’evento indicato
  • Riga 12: Contiene l’identificatore univoco all’interno del nodo catalog_product_save_after.
    Per convenzione, si utilizza la solita nomenclatura NomeVendor + ‘_’ + NomeModulo, ma questa volta in lowercase (tutto minuscolo).
  • Riga 13: Definisce la classe Model da istanziare, che contiene il metodo che verrà richiamato
  • Riga 14: Contiene, finalmente, il nome del metodo da richiamare, il quale esegue quanto ci siamo promessi

Adesso Magento ha tutte le informazioni necessarie. Sa quale metodo eseguire, dove reperirlo, a quale classe appartiene e a quale evento deve agganciarlo. Non ti resta che scrivere il codice vero e proprio.


La classe Observer

Come stabilito nel file:

app/code/local/Code4Life/ProductUpdateHistory/etc/config.xml

Magento si aspetta una classe in cui cercare il metodo da eseguire ed è nostro compito crearla.

All’interno della cartella del nostro modulo, crea una cartella chiamata Model ed al suo interno crea un file Observer.php, ottenendo:

app/code/local/Code4Life/ProductUpdateHistory/Model/Observer.php

con il seguente contenuto:

class Code4Life_ProductUpdateHistory_Model_Observer {
	public function writeLogOnProductUpdate( Varien_Event_Observer $oObserver ) {
		$oProduct = $oObserver->getEvent()->getProduct();
		$sUserId = Mage::getSingleton( 'admin/session' )->getUser()->getUserId();
		Mage::log( 'Il prodotto "' . $oProduct->getName() . '" (ID: ' . $oProduct->getId() . ') è stato aggiornato [USER ID: ' . $sUserId . '].', null, 'product_updates.log' );
	}
}

ed il gioco è fatto!
In particolare, nella riga 5 viene utilizzato il metodo statico log() che si occupa di creare una riga di log in cui abbiamo inserito il nostro messaggio di aggiornamento avvenuto, con particolare riferimento al prodotto aggiornato e a quale utente lo ha modificato.

Finalmente, il tuo primo modulo per Magento è davvero completo, non ti resta che provarlo. Entra nel backend del tuo Magento e prova ad aggiornare un prodotto, vedrai il risultato dei tuoi sforzi prendere forma nel file:

var/log/product_updates.log

che conterrà le informazioni generate dal metodo writeLogOnProductUpdate della classe Observer.

Non ti resta che fare tesoro di questa guida, costruendo moduli via via più complessi ed adeguati alle tue esigenze.


Una precisazione

Nel caso specifico preso in esame, ci siamo occupati di scrivere un file di log. Qualora non dovessi trovare il file nel percorso indicato dopo l’aggiornamento dei prodotti, assicurati di aver abilitato la possibilità di scrivere file di log. Nel backend del tuo Magento, vai su:

Sistema > Configurazione > Sviluppatore > Impostazioni log

ed assicurati che l’opzione Abilitato sia impostata su Si.



Ti è piaciuto questo articolo? Regalami un click per ripagarmi dello sforzo



Code4Life ti è stato utile? Sostienici con una donazione!

Dona con PayPal

Hai trovato interessante l’articolo? Allora ti consiglio di leggere:

Il filesystem di Magento

Il filesystem di Magento


Come districarsi nelle molteplici cartelle e files del tuo Magento? Detto, fatto. Ecco una piccola guida che ti aiuterà a capire la struttura di base delle directory, così da sapere dove cercare i files che ti occorrono.

Creare un widget personalizzato sulla dashboard di WordPress

Creare un widget personalizzato sulla dashboard di WordPress


Ecco come migliorare la dashboard nel backend di WordPress, aggiungendo un widget personalizzato che visualizzi le informazioni che occorre avere in primo piano.

Oppure cerca tra gli articoli correlati


E tu cosa ne pensi? Condividi la tua opinione e discutiamone insieme
La tua email non sarà resa pubblico o utilizzata per inviarti spam, te lo prometto

Iscrivimi alla newsletter per ricevere news ed aggiornamenti
Utilizziamo piattaforme di terze parti per l’invio di newsletter. (Informativa sulla privacy)
Tienimi aggiornato su questo articolo
Ricevi una email di notifica quando qualcuno scriverà un commento a questo articolo. (Informativa sulla privacy)
Ricorda i miei dati per la prossima volta che scriverò un commento
Il tuo nome e la tua email verranno salvati in un cookie in questo browser. (Informativa sulla privacy)