Una delle esigenze che spesso vengono richieste dai clienti che utilizzano la piattaforma e-commerce Magento, è quella di manipolare dei dati di Magento ma da fuori Magento stesso. Ad esempio estrapolare e/o modificare ordini, clienti, prodotti, categorie e quant’altro si voglia reperire o modificare dal sistema accedendo ed utilizzando le funzioni che la piattaforma mette a disposizione.
Per fare ciò serve scrivere uno shell script in PHP che fa il bootstrap di Magento, ovvero che ne istanzia l’ambiente.
Abbiamo più modi per implementare questo script e in questo articolo vedremo il metodo semplice e il metodo “di Magento”.
Metodo Semplice
Un programmatore PHP di medio livello, oppure chi da poco sta lavorando con Magento, come prima cosa andrebbe a vedere cosa fa Magento nel suo file index.php e scoprirebbe che dopo qualche controllo viene incluso il file app/Mage.php.
Per il metodo semplice siamo quasi pronti: è sufficiente chiamare la funzione di bootstrap di Magento e voilà il gioco è fatto!
Quindi creando un nuovo file PHP nella cartella root di Magento il codice per Metodo Semplice è il seguente:
<?php require_once 'app/Mage.php'; Mage::app(); // Qui il nostro codice ?>
Non c’è niente di male ad utilizzare questo approccio ma ci sono degli aspetti negativi rispetto al metodo di Magento come specificheremo dopo.
Metodo di Magento
Adesso vediamo il secondo modo di creare uno shell script in PHP per interagire con Magento.
In questo caso, invece di prendere spunto dal file index.php, andiamo a vedere nella cartella shell che troviamo nella root di Magento. Qui troviamo, per esempio, il file indexer.php (che possiamo usare per reindicizzare Magento) e altri files creati con il Metodo Magento. Se guardiamo dentro questi files scopriremo che questi includono il file shell/abstract.php e che definiscono una classe che estende Mage_Shell_Abstract contenuta proprio nel file incluso.
Viene da chiedersi come può essere meglio questo metodo rispetto a quello semplice dato che il costruttore della classe Mage_Shell_Abstract fa più o meno le stesse cose?
Uno dei vantaggi di usare il Metodo di Magento è che la classe Mage_Shell_Abstract ci fornisce tutti i tools per “parsare” con facilità gli argomenti passati da linea di comando.
Seconda cosa, il costruttore della classe Mage_Shell_Abstract chiama la funzione Mage_Shell_Abstract::__applyPhpVariables() che “parsa” il file .htaccess e applica allo shell script la configurazione di PHP.
Anche se a questo punto è ovvio procedere, metto qui sotto il codice di una classe per uno shell script in PHP scritto con il Metodo di Magento:
<?php require_once 'abstract.php'; class Htt_Shell_Testscript extends Mage_Shell_Abstract { protected $_parametri = array(); public function __construct() { parent::__construct(); // Tempo infinito set_time_limit(0); // Prendo il parametro da linea di comando che si chiama "nomeparametro" // Accepts multiple values (comma separated) if ($this->getArg('nomeparametro')) { $this->_parametri = array_merge($this->_parametri, array_map('trim', explode(',', $this->getArg('nomeparametro')))); } } // Punto di partenza dello script public function run() { } // Istruzioni di uso dello script public function usageHelp() { return <<<USAGE Usage: php -f nomedelfile.php -- [options] --nomeparametro Descrizione del parametro help Questo help USAGE; } } // Istanziazione della classe $shell = new Htt_Shell_Testscript(); // Istanziazione script $shell->run();