Magento fournit dans sa distribution des scripts shell PHP qui permettent d’effectuer des tâches de maintenance sur un site Magento, directement depuis la ligne de commande.
Le but de cet article est de présenter ces scripts, et de voir comment il est possible de créer ses propres scripts.
Les scripts shell inclus dans Magento
Ces scripts sont regroupés dans le répertoire shell/ de la distribution Magento :
- compiler.php permet de manipuler le compilateur de Magento (le compilateur est également accessible dans le back-office dans le menu Système > Outils > Compilation)
- indexer.php permet de gérer les indexes de Magento (accessibles également dans le back-office dans le menu Système > Gestion des indexes) : il permet notamment de mettre à jour un ou plusieurs indexes, ou de basculer un index entre le mode de ré-indexation manuel et le mode de ré-indexation automatique
- log.php permet d’afficher des statistiques basiques sur les tables de journalisation du site, et de nettoyer ces tables.
L’un des avantages de ces scripts est de pouvoir automatiser ces tâches de maintenance : indexer.php pourra par exemple être inclus dans un batch quotidien de mise à jour des produits et des stocks, et permettra de lancer automatiquement la régénération des indexes produits et stocks.
Pour lancer ces scripts depuis la ligne de commande, on utilise la syntaxe suivante :
php -f [chemin/vers/nom_du_script].php -- [options]
Les scripts prennent en arguments une ou plusieurs options, dont la liste est disponible en utilisant l’option help :
php -f shell/indexer.php -- help
A titre d’exemple, la ligne de commande suivante permet de lancer la réindexation des prix des produits dans Magento :
php -f shell/indexer.php -- --reindex catalog_product_price
La classe Mage_Shell_Abstract
La classe Mage_Shell_Abstract est une classe abstraite fournie par Magento, sur laquelle s’appuie les 3 scripts de maintenance présentés ci-dessus, qui sont en fait des implémentations de cette classe.
Cette classe, relativement simple, fournit les méthodes suivantes :
- getArg() qui permet de récupérer un argument passé au script sur la ligne de commande
- usageHelp() qui permet l’affichage d’un message d’aide sur l’utilisation du script
- run() qui est la méthode à appeler lors du lancement du script.
Créer son propre script shell
Nous choisirons l’exemple d’un script simple dont le but est de lister l’ensemble des produits actuellement en promotion sur le site, et de calculer le pourcentage de réduction pour chaque promotion.
Dans un premier temps, nous créons un fichier my_script.php dans le répertoire shell/ de l’installation Magento.
Le script doit d’abord importer la classe abstraite Mage_Shell_Abstract, et déclarer la classe contenant le script, qui doit étendre la classe abstraite :
require_once 'abstract.php'; class My_Script extends Mage_Shell_Abstract { }
Ensuite, nous implémentons la méthode usageHelp(), qui affichera un message d’aide relatif à l’utilisation du script dans la ligne de commande :
public function usageHelp() { return <<<USAGE Usage: php -f my_script.php -- [options] by_date Sort products by discount ending date help This help USAGE; }
Il nous faut désormais implémenter la méthode run(), méthode à appeler lors du lancement du script.
Cette méthode aura pour fonction de :
- récupèrer la liste (collection) des produits actuellement en promotion, c’est à dire les produits qui ont un prix spécial, et qui en ont un en cours à la date du jour
- trier la liste des produits selon la date de fin de promotion, si ce tri est spécifié dans la ligne de commande par l’option by_date
- afficher les résultats sous la forme d’un tableau formatté
L’appel au script devra juste instancier la classe, et appeler la méthode run() :
$shell = new My_Script(); $shell->run();
Le script complet est le suivant :
<?php require_once 'abstract.php'; class My_Script extends Mage_Shell_Abstract { /* * Lance le script */ public function run() { // Sélectionner les produits ayant une promotion en cours $now = Mage::getModel('core/date')->timestamp(time()); $date = date('Y-m-d h:i:s', $now); $collection = Mage::getResourceModel('catalog/product_collection'); $collection = Mage::getResourceModel('catalog/product_collection')->addAttributeToSelect('*'); $collection->addAttributeToFilter('special_price',array('neq' => 0)) ->addAttributeToFilter('special_from_date', array('date' => true, 'to' => $date)) ->addAttributeToFilter(array( array('attribute' => 'special_to_date', 'date' => true, 'from' => $date), array('attribute' => 'special_to_date', 'is' => new Zend_Db_Expr('null')) )); // Trier les produits selon leur nom (défaut) ou selon la date de fin de la promotion if ($this->getArg('by_date')){ $collection->addAttributeToSort('special_to_date','asc'); } else { $collection->addAttributeToSort('name','asc'); } // Afficher les produits $mask = "| %-3.3s| %-50.50s | %-3.3s| %-10.10s|\n"; echo "-----------------------------------------------------------------------------\n"; printf($mask, '', 'Product name', '%', 'End date'); echo "-----------------------------------------------------------------------------\n"; $productCount = 0; foreach ($collection->getItems() as $product){ $productPrice = $product->getPrice(); $productSpecialPrice = $product->getSpecialPrice(); // Calculer le pourcentage de réduction du produit $discountPercent = ceil(100.0 - ($productSpecialPrice * 100.0)/ $productPrice); $productCount++; printf($mask, $productCount, $product->getName(), $discountPercent, $product->getSpecialToDate()); } echo "-----------------------------------------------------------------------------\n"; // Afficher l'aide if ($this->getArg('help')) { echo $this->usageHelp(); } } /** * Affiche l'aide pour utilisation du script * */ public function usageHelp() { return <<<USAGE Usage: php -f my_script.php -- [options] by_date Sort products by discount ending date help This help USAGE; } } // Lancer le script $shell = new My_Script(); $shell->run();
Utilisation du script
Le script s’utilise de la façon suivante :
$ php -f shell/my_script.php ----------------------------------------------------------------------------- | | Product name | % | End date | ----------------------------------------------------------------------------- | 1 | HTC Touch Diamond | 7 | 2014-06-11| | 2 | Logitech Cordless Optical Trackman | 25 | 2014-06-13| | 3 | Microsoft Wireless Optical Mouse 5000 | 17 | | -----------------------------------------------------------------------------
Il est possible d’ajouter une option by_date qui triera la liste des produits par date de fin de promotion :
$ php -f shell/my_script.php -- by_date ----------------------------------------------------------------------------- | | Product name | % | End date | ----------------------------------------------------------------------------- | 1 | Microsoft Wireless Optical Mouse 5000 | 17 | | | 2 | HTC Touch Diamond | 7 | 2014-06-11| | 3 | Logitech Cordless Optical Trackman | 25 | 2014-06-13| -----------------------------------------------------------------------------
Conclusion
La création de script shell est rendue simple dans Magento grâce à la classe Mage_Shell_Abstract.
Le développement de scripts spécifiques peut s’avérer utile dans de nombreuses situations, pour par exemple :
- automatiser une tâche (exemple : nettoyer les paniers inactifs depuis plus de 24 heures),
- effectuer un traitement sur un grand nombre d’entrées (exemple : passer une longue liste de commandes dans le statut « expédié »),
- réaliser une opération très spécifique, non réalisable en utilisant le back-office,
- tester rapidement un code lors d’un développement,
- reproduire un état particulier pour pouvoir effectuer des tests de recette (exemple : reproduire une configuration particulière, un stock particulier d’un produit, passer une ou plusieurs commandes dans un statut à tester…).