La gestione degli eventi e dei relativi plugin viene affrontata da Magento con l'utilizzo intensivo del pattern Observer. Sono presenti oltre 250 eventi , ai quali aggiungere quelli richiamabili con un nome dinamico. Oggi ne vediamo uno di esempio, con il quale sconteremo tutti i prezzi dei prodotti del 10%.
Oltre 250 eventi : gli sviluppatori di Magento hanno pensato davvero a tutto, quando hanno deciso di implementare il pattern Observer per la creazione di plugin (Joomla, che pure offre un buon supporto in merito, si ferma a 60 eventi).
L'elenco degli eventi disponibili lo trovate sul wiki ufficiale.
Oggi creiamo un plugin di esempio, grazie al quale sconteremo sul sito i prezzi di tutti i prodotti del catalogo del 10%. La modifica avrà effetto solo sul sito e non sul pannello di amministrazione: si tratta ovviamente di un plugin a scopo didattico, però potrebbe tornarci utile se ad esempio un cliente ci dovesse chiedere di scontare "al volo" tutti i prodotti per una vendita last-minute di qualche ora.
Ho chiamato il mio modulo "Eventi" (in italiano, cosi da non generare confusione con la parola "events" che viene usata da Magento) ed il namespace è Infocurci. Per prima cosa creiamo il file Infocurci_Eventi.xml da salvare dentro app/etc/modules:
<?xml version="1.0"?>
<config>
<modules>
<Infocurci_Eventi>
<active>true</active>
<codePool>local</codePool>
<version>0.1.0</version>
</Infocurci_Eventi>
</modules>
</config>
Fin qui nulla da spiegare, si tratta del solito file di attivazione del modulo di Magento. L'ho impostato direttamente ad active perché il modulo è basato su appena 2 files, quindi lo implementeremo in pochissimo tempo e potremo subito vederlo all'opera. Se state (mi auguro di no!) lavorando in ambiente di produzione, impostate il modulo a false e attivatelo solo quando avete pubblicato gli altri due files qui sotto.
Creiamo adesso il file di configurazione del nostro piccolo modulo. Salviamo il file config.xml dentro la cartella app/code/local/Infocurci/Eventi/etc:
<?xml version="1.0"?>
<config>
<modules>
<Infocurci_Eventi>
<version>0.1.0</version>
</Infocurci_Eventi>
</modules>
<global>
<models>
<eventi>
<class>Infocurci_Eventi_Model</class>
</eventi>
</models>
</global>
<frontend>
<events>
<catalog_product_get_final_price>
<observers>
<eventi>
<class>eventi/observer</class>
<method>processFrontFinalPrice</method>
</eventi>
</observers>
</catalog_product_get_final_price>
</events>
</frontend>
</config>
Abbiamo dichiarato lo stretto indispensabile per il modulo: la versione, il namespace del model e sopratutto la parte che riguarda la gestione degli eventi.
<events> è la parola chiave di configurazione che indica a Magento la gestione di un evento;
<catalog_product_get_final_price> è il nome attribuito da Magento all'evento (a inizio articolo abbiamo visto il link alla tabella con tutti gli eventi disponibili);
<class>eventi/observer</class> indica a Magento di cercare il file Infocurci_Eventi_Model_Observer
<method>processFrontFinalPrice</method> indica a Magento di richiamare il metodo processFrontFinalPrice della classe appena dichiarata.
Infine, creiamo il file che gestisce il plugin vero e proprio: Observer.php, da salvare dentro app/code/local/Infocurci/Eventi/Model:
<?php
class Infocurci_Eventi_Model_Observer
{
public function processFrontFinalPrice($observer)
{
$product = $observer->getEvent()->getProduct();
$product->setFinalPrice($product->getFinalPrice() - ($product->getFinalPrice() *10 /100));
return $this;
}
}
Grazie all'oggetto $observer possiamo risalire agevolmente al prodotto in questione e scontarlo del 10% .
Ed ecco qui il nostro plugin in azione! Se volete continuare a far pratica con i plugin di Magento, potete fare questo "compito a casa": questo plugin funziona bene (il prezzo scontato rimane tale anche nel carrello e nel checkout) ma non sconta il prodotto in alcune pagine del sito, come ad esempio quella che impagina i risultati di una query di ricerca. Riuscite a fare in modo che il prezzo appaia scontato anche in quel caso? ciao