Créer une commande pour n98-magerun

magento_logo

L’outil n98-magerun est la console manquante à Magento 1.x. Elle rend accessible en ligne de commande bon nombre de fonctionnalités comme le lancement des scripts de mise à jour, le changement de mot de passe admin, le flush du cache, l’affichage des astuces pour le débuggage des blocks/templates… Nous allons voir qu’il est également possible de créer très simplement ses propres commandes en disposant de toute la souplesse de la console Symfony 2.

Installation de n98-magerun

Utilisez les commandes suivantes pour télécharger l’outil et le rendre accessible de manière globale via la commande magerun :

wget http://files.magerun.net/n98-magerun-latest.phar -O n98-magerun.phar
chmod +x n98-magerun.phar
sudo mv n98-magerun.phar /usr/local/bin/magerun
magerun --version

Vous devriez avoir la sortie suivante :

n98-magerun version 1.97.7 by netz98 new media GmbH

 

Déclarer ses commandes

Dans cet article nous allons créer une commande spécifique à un projet en particulier. Pour cela nous allons créer un fichier app/etc/n98-magerun.yaml. Sachez toutefois qu’il est possible de déclarer des commandes à partir d’un fichier n98-magerun.yaml qui se trouverait dans votre répertoire utilisateur, celles-ci seraient alors accessibles à l’ensemble de vos projets locaux. Voici le contenu de notre fichier de configuration :

autoloaders:
  My: %root%/shell/magerun

commands:
  customCommands:
    - My\ProductsCommand

Nous déclarons ainsi un namespace My pour nos commandes qui se situeront dans le répertoire shell/magerun de notre projet. La variable %root% permet de faire référence à la racine du projet. La commande que nous allons implémenter se nomme ProductsCommand et nous permettra d’afficher une liste de produits.

Création du squelette

Il nous reste à créer le répertoire ./shell/magerun/My et d’y placer un fichier ProductsCommand.php avec le contenu suivant :

<?php

namespace My;

use N98\Magento\Command\AbstractMagentoCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;

class ProductsCommand extends AbstractMagentoCommand
{
    protected function configure()
    {
        $this->setName('catalog:product:list')
            ->setDescription('Prints a list of products');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->detectMagento($output);
        if ($this->initMagento()) {
            $output->writeln('TODO');
        }
    }
}

Nous disposons du squelette de notre commande. Vous pouvez y voir une méthode configure() qui permet de définir les caractéristiques de la commande ainsi qu’une méthode execute() qui sert à son exécution.

Le nom de la commande est celui qui sera utilisé lors d’un appel avec l’outil n98-magerun. Exécutez la commande magerun list pour voir cette commande apparaître dans la liste sous le groupe “catalog” :

$ magerun list
...
catalog
 catalog:product:list             Prints a list of products
...

Nous aurions pu ne pas utiliser de séparateur (deux-points) dans le nom de notre commande et l’appeler simplement “products”. Cela aurait eu pour effet de la voir s’afficher dans les commandes non groupées aux côtés de install et list par exemple, mais il est préférable de grouper vos commandes par thème pour les retrouver plus facilement.

Si vous exécutez la commande, vous verrez qu’elle affiche simplement la chaîne de caractères “TODO” puisque nous n’avons pas encore développé la logique de la commande. Vous remarquerez toutefois l’utilisation des méthodes detectMagento() et initMagento() qui permettent respectivement de vérifier qu’une installation de Magento est bien disponible et d’initialiser l’application pour avoir accès à son code.

Affichage d’une liste de produits

Ce qui est pratique avec la console Symfony, c’est qu’elle nous facilite bon nombre d’opérations dont l’affichage de données dans votre ligne de commande. Nous allons ainsi très simplement pouvoir afficher un tableau contenant la liste de nos produits et leurs principaux attributs. Voici le code de la méthode execute() mis à jour :

protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->detectMagento($output);
        if ($this->initMagento()) {

            $collection = \Mage::getResourceModel('catalog/product_collection');
            $collection->addAttributeToSelect(array('entity_id', 'sku', 'name', 'type_id', 'price', 'status'));
            $collection->setPageSize(10);

            $table = array();
            foreach ($collection as $product) {
                $table[] = array(
                    $product->getId(),
                    $product->getSku(),
                    $product->getName(),
                    $product->getTypeId(),
                    $this->getCoreHelper()->formatPrice($product->getPrice(), false),
                    $this->formatActive($product->getStatus()),
                );
            }

            if (count($table) > 0) {
                $this->getHelper('table')
                    ->setHeaders(array('id', 'sku', 'name', 'type', 'price', 'status'))
                    ->setRows($table)
                    ->render($output);
            } else {
                $output->writeln('<comment>No products found</comment>');
            }

        }
    }

Exécutez la commande et admirez le résultat :

command_result

Nous avons utilisé un code Magento très simple pour récupérer les informations d’une collection de produits dans un tableau. C’est ensuite la console Symfony qui fait le reste. Tout ce que nous avons à faire est de définir l’entête du tableau avec la méthode setHeaders() puis de passer nos données à la méthode setRows(). L’affichage se fait très simplement avec la méthode render() qui prend en paramètre la sortie de notre commande. Et voilà le tour est joué.

Conclusion

Nous avons vu que n98-magerun permet très simplement de déclarer des commandes personnalisées. L’outil reposant sur la console Symfony 2, on en tire tous les bénéfices notamment au niveau des helpers facilitant l’affichage de données. Mais vous pouvez aller bien plus loin, notamment au niveau de la gestion des options. On est bien loin des scripts shell qui étendent Mage_Shell_Abstract ! Amusez-vous.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.