Magento : Ajouter des filtres dans la grid des produits d’une catégorie

Cet article est assez ancien, malgré toute l'attention que j' apporte à mes contenus il est possible que celui-ci ne soit plus d'actualité.
N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.

J’ai récemment fait face aux limites de la gestion des produits des catégories dans l’administration de Magento.

En effet, dans l’onglet « Produits de la catégories » l’ensemble des produits associés sont listés, et il n’est pas possible de filtrer ceux qui ne sont pas visibles en front office ( Produits désactivés, produits non visibles individuellement, ou uniquement dans la recherche )

Pour optimiser cela, nous allons donc rajouter les possibilités suivantes à la grid :

  • Filtrer par status ( Actif / Non actif )
  • Filtrer par visibilité ( Non visible individuellement, Catalogue … )

Pour faire cela nous allons réaliser un nouveau module.
Je ne détaille pas la création du module ni tout ce qui est générique car cet exemple est le même que pour le cas suivant : https://www.h-hennes.fr/blog/2015/06/29/magento-ajouter-un-attribut-personnalise-a-la-grid-des-produits-via-les-observers/

Le module qui réalise les 2 actions  est disponible sur github : https://github.com/nenes25/magento_productGridFilter)

Il serait possible de surcharger directement la grid Mage_Adminhtml_Block_Catalog_Category_Tab_Product  pour faire cela, mais magento permets de le faire plus proprement via des Observers.

On va donc utiliser les observers suivants :

  • core_block_abstract_to_html_before
  • eav_collection_abstract_load_before

Dans notre fichier Observer, il faudra ensuite mettre les codes suivants :

 <?php
class Hhennes_ProductGridFilter_Model_Observer {
 
    /**
     * Affichage la grille Magento 
     * On affiche une nouvelle colonne
     * @param Varien_Event_Observer $observer
     * @return type
     */
    public function onBlockHtmlBefore(Varien_Event_Observer $observer) {
 
        $block = $observer->getEvent()->getBlock();
        if (!isset($block))
            return;
        
        if ( $block->getType() == 'adminhtml/catalog_category_tab_product') {
                        
                //Ajout du filtre sur le statut
                $block->addColumnAfter('status', array(
                    'header' => Mage::helper('hhennes_productgridfilter')->__('status'),
                    'align' => 'left',
                    'index' => 'status',
                    'type' => 'options',
                    'options' => Mage::getSingleton('catalog/product_status')->getOptionArray(),
                    'width' => '70'
                    ),
                    'sku');
                
                //Ajout du filtre sur la visibilité
                $block->addColumnAfter('visibility', array(
                    'header' => Mage::helper('hhennes_productgridfilter')->__('visibility'),
                    'align' => 'left',
                    'index' => 'visibility',
                    'type' => 'options',
                    'options' => Mage::getModel('catalog/product_visibility')->getOptionArray(),
                    'width' => '70'
                    ),
                    'sku');
        }
    }
 
    /**
     * Récupération de la référence produit au chargement de la collection
     * @param Varien_Event_Observer $observer
     * @return type
     */
    public function onEavLoadBefore(Varien_Event_Observer $observer) {
 
        $collection = $observer->getCollection();
        
        if (!isset($collection))
            return;
        
        //Affichage des filtres "visibilité" et "statut" dans le listing des produits des catégories
        if (   is_a($collection, 'Mage_Catalog_Model_Resource_Product_Collection') 
                && Mage::app()->getRequest()->getControllerName() == 'catalog_category') {
 
            //Récupération des informations de statut    
            $collection->joinAttribute(
                    'status', 'catalog_product/status', 'entity_id', null, 'inner', Mage::app()->getRequest()->getParam('store')
            );
            
            //Récupération des informations de visibilité
            $collection->joinAttribute(
                    'visibility', 'catalog_product/visibility', 'entity_id', null, 'inner', Mage::app()->getRequest()->getParam('store')
            );
        }
    }
 
}

Une fois le code en place, vous aurez bien 2 nouveaux filtres dans l’administration, ce qui vous permettra d’affiner votre filtrage 🙂
Filtre grid produits catégorie

Laisser un commentaire

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