Magento : Ajouter un attribut personnalisé à la grid des produits via les observers

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.

Vous avez forcément sur votre boutique Magento, des attributs produits spécifiques à votre site.
Si vous souhaitez les afficher dans la grid des produits, et pouvoir filtrer les produits via cet attribut, voici comment procéder.

Le méthode la plus propre est de passer par les observers de Magento, ceci évitera de créer des surcharges pouvant entrainer des problèmes de compatibilités.
Je passe volontairement toute la partie liée à la création du module pour se concentrer uniquement sur la partie spécifique à l’affichage de l’attribut dans la grid.

Pour que notre modification fonctionne, le module va se greffer sur les événements suivants :

  • core_block_abstract_to_html_before : Pour afficher l’attribut dans la grid des produits
  • eav_collection_abstract_load_before : Pour charger les valeurs de l’attribut dans la collection des produits

Voici donc les données  à faire figurer dans le fichier de configuration config.xml de votre module :
Veuillez à bien remplacer le nom du modèle ( hhennes_productgridfilter ) par le nom de votre module

<adminhtml>
        <events>
            <core_block_abstract_to_html_before>
                <observers>
                   <product_filter_reference>
                        <class>hhennes_productgridfilter/observer</class>
                        <method>onBlockHtmlBefore</method>
                    </product_filter_reference>
                </observers>
            </core_block_abstract_to_html_before>
            <eav_collection_abstract_load_before>
                <observers>
                    <product_filter_reference_load>
                        <class>hhennes_productgridfilter/observer</class>
                        <method>onEavLoadBefore</method>
                    </product_filter_reference_load>
                </observers>
            </eav_collection_abstract_load_before>
        </events>
  </adminhtml>

Passons à présent à l’édition de l’observer du module qui sera situé dans modulename/Model/Observer.php
Dans mon cas j’ajoute un attribut « reference » qui existe déjà dans la boutique, mais il peut être remplacé par l’attribut produit existant de votre choix.

<!--?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();<br ?--> <?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;
 
        //Si le block correspond à la grid d'affichage des produits  
        if ($block->getType() == 'adminhtml/catalog_product_grid') {
 
            //On ajoute un nouveau champ "Reference" après le champ SKU
            $block->addColumnAfter('reference', array(//Le champ reference peu être remplacé par l'attribut existant de votre choix
                'header' => Mage::helper('hhennes_productgridfilter')->__('Reference interne'),
                'align' => 'left',
                'index' => 'reference',
                'width' => '70'), 'sku'); // Idem sku peut etre remplacé par n'importe quel élément de votre grid
        }
    }
 
    /**
     * 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;
 
        //Si la collection est une collection Mage_Catalog_Model_Resource_Product_Collection on ajoute les valeurs de ce champ à la collection
        if (is_a($collection, 'Mage_Catalog_Model_Resource_Product_Collection')) {
            $collection->addAttributeToSelect('reference'); //Le champ reference peu être remplacé par l'attribut existant de votre choix 
        }
    }
 
}

Voici un aperçu du rendu après prise en compte du code :

Magento product grid attribute

Une nouvelle colonne « Référence interne » a bien été rajoutée à la suite de la colonne « Sku », et il est possible de trier les résultats de la recherche via ce nouvel attribut 🙂

Edit 2015-07-08 :
Pour ceux qui ne souhaitent pas coder, le code est imbriqué dans un module sur github.
Celui-ci permets également de choisir via l’administration quel champ doit être affiché

https://github.com/nenes25/magento_productGridFilter

Laisser un commentaire

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