{"id":1026,"date":"2015-06-29T17:43:11","date_gmt":"2015-06-29T15:43:11","guid":{"rendered":"http:\/\/www.h-hennes.fr\/blog\/?p=1026"},"modified":"2015-07-08T13:38:42","modified_gmt":"2015-07-08T11:38:42","slug":"magento-ajouter-un-attribut-personnalise-a-la-grid-des-produits-via-les-observers","status":"publish","type":"post","link":"https:\/\/www.h-hennes.fr\/blog\/2015\/06\/29\/magento-ajouter-un-attribut-personnalise-a-la-grid-des-produits-via-les-observers\/","title":{"rendered":"Magento : Ajouter un attribut personnalis\u00e9 \u00e0 la grid des produits via les observers"},"content":{"rendered":"<p>Vous avez forc\u00e9ment sur votre boutique Magento, des attributs produits sp\u00e9cifiques \u00e0 votre site.<br \/>\nSi vous souhaitez les afficher dans la grid des produits, et pouvoir filtrer les produits via cet attribut, voici comment proc\u00e9der.<\/p>\n<p>Le m\u00e9thode la plus propre est de passer par les <em>observers de Magento<\/em>, ceci \u00e9vitera de cr\u00e9er des surcharges pouvant entrainer des probl\u00e8mes de compatibilit\u00e9s.<br \/>\nJe passe volontairement toute la partie li\u00e9e \u00e0 la cr\u00e9ation du module pour se concentrer uniquement sur la partie sp\u00e9cifique \u00e0 l&rsquo;affichage de l&rsquo;attribut dans la grid.<\/p>\n<p>Pour que notre modification fonctionne, le module va se greffer sur les \u00e9v\u00e9nements suivants :<\/p>\n<ul>\n<li><strong>core_block_abstract_to_html_before<\/strong> : Pour afficher l\u2019attribut dans la grid des produits<\/li>\n<li><strong>eav_collection_abstract_load_before<\/strong> : Pour charger les valeurs de l&rsquo;attribut dans la collection des produits<\/li>\n<\/ul>\n<p>Voici donc les donn\u00e9es\u00a0 \u00e0 faire figurer dans le fichier de configuration <strong>config.xml<\/strong> de votre module :<br \/>\nVeuillez \u00e0 bien remplacer le nom du mod\u00e8le ( <em>hhennes_productgridfilter<\/em> ) par le nom de votre module<\/p>\n<pre lang=\"xml\" escaped=\"true\">&lt;adminhtml&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;events&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;core_block_abstract_to_html_before&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;observers&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;product_filter_reference&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;class&gt;hhennes_productgridfilter\/observer&lt;\/class&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;method&gt;onBlockHtmlBefore&lt;\/method&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/product_filter_reference&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/observers&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/core_block_abstract_to_html_before&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;eav_collection_abstract_load_before&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;observers&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;product_filter_reference_load&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;class&gt;hhennes_productgridfilter\/observer&lt;\/class&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;method&gt;onEavLoadBefore&lt;\/method&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/product_filter_reference_load&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/observers&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/eav_collection_abstract_load_before&gt;\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &lt;\/events&gt;\r\n\u00a0 &lt;\/adminhtml&gt;\r\n<\/pre>\n<p>Passons \u00e0 pr\u00e9sent \u00e0 l&rsquo;\u00e9dition de l&rsquo;observer du module qui sera situ\u00e9 dans <strong><em>modulename<\/em>\/Model\/Observer.php<\/strong><br \/>\nDans mon cas j&rsquo;ajoute un attribut \u00ab\u00a0reference\u00a0\u00bb qui existe d\u00e9j\u00e0 dans la boutique, mais il peut \u00eatre remplac\u00e9 par l&rsquo;attribut produit existant de votre choix.<\/p>\n<pre lang=\"php\" escaped=\"true\"><!--?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-&gt;getEvent()-&gt;getBlock();&lt;br ?--> &lt;?php\r\n\r\nclass Hhennes_ProductGridFilter_Model_Observer {\r\n\r\n\u00a0\u00a0\u00a0 \/**\r\n\u00a0\u00a0\u00a0\u00a0 * Affichage la grille Magento \r\n\u00a0\u00a0\u00a0\u00a0 * On affiche une nouvelle colonne\r\n\u00a0\u00a0\u00a0\u00a0 * @param Varien_Event_Observer $observer\r\n\u00a0\u00a0\u00a0\u00a0 * @return type\r\n\u00a0\u00a0\u00a0\u00a0 *\/\r\n\u00a0\u00a0\u00a0 public function onBlockHtmlBefore(Varien_Event_Observer $observer) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $block = $observer-&gt;getEvent()-&gt;getBlock();\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (!isset($block))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Si le block correspond \u00e0 la grid d'affichage des produits \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ($block-&gt;getType() == 'adminhtml\/catalog_product_grid') {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/On ajoute un nouveau champ \"Reference\" apr\u00e8s le champ SKU\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $block-&gt;addColumnAfter('reference', array(\/\/Le champ reference peu \u00eatre remplac\u00e9 par l'attribut existant de votre choix\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'header' =&gt; Mage::helper('hhennes_productgridfilter')-&gt;__('Reference interne'),\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'align' =&gt; 'left',\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'index' =&gt; 'reference',\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'width' =&gt; '70'), 'sku'); \/\/ Idem sku peut etre remplac\u00e9 par n'importe quel \u00e9l\u00e9ment de votre grid\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 \/**\r\n\u00a0\u00a0\u00a0\u00a0 * R\u00e9cup\u00e9ration de la r\u00e9f\u00e9rence produit au chargement de la collection\r\n\u00a0\u00a0\u00a0\u00a0 * @param Varien_Event_Observer $observer\r\n\u00a0\u00a0\u00a0\u00a0 * @return type\r\n\u00a0\u00a0\u00a0\u00a0 *\/\r\n\u00a0\u00a0\u00a0 public function onEavLoadBefore(Varien_Event_Observer $observer) {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $collection = $observer-&gt;getCollection();\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (!isset($collection))\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 return;\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Si la collection est une collection Mage_Catalog_Model_Resource_Product_Collection on ajoute les valeurs de ce champ \u00e0 la collection\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (is_a($collection, 'Mage_Catalog_Model_Resource_Product_Collection')) {\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $collection-&gt;addAttributeToSelect('reference'); \/\/Le champ reference peu \u00eatre remplac\u00e9 par l'attribut existant de votre choix \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\r\n}\r\n<\/pre>\n<p>Voici un aper\u00e7u du rendu apr\u00e8s prise en compte du code :<\/p>\n<p><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2015\/06\/attribut-grid.jpg\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1027\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2015\/06\/attribut-grid.jpg\" alt=\"Magento product grid attribute\" width=\"700\" height=\"162\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2015\/06\/attribut-grid.jpg 700w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2015\/06\/attribut-grid-300x69.jpg 300w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/a><\/p>\n<p>Une nouvelle colonne \u00ab\u00a0R\u00e9f\u00e9rence interne\u00a0\u00bb a bien \u00e9t\u00e9 rajout\u00e9e \u00e0 la suite de la colonne \u00ab\u00a0Sku\u00a0\u00bb, et il est possible de trier les r\u00e9sultats de la recherche via ce nouvel attribut \ud83d\ude42<\/p>\n<p><strong>Edit 2015-07-08 :<\/strong><br \/>\nPour ceux qui ne souhaitent pas coder, le code est imbriqu\u00e9 dans un module sur github.<br \/>\nCelui-ci permets \u00e9galement de choisir via l&rsquo;administration quel champ doit \u00eatre affich\u00e9<\/p>\n<p><a href=\"https:\/\/github.com\/nenes25\/magento_productGridFilter\" target=\"_blank\">https:\/\/github.com\/nenes25\/magento_productGridFilter<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Vous avez forc\u00e9ment sur votre boutique Magento, des attributs produits sp\u00e9cifiques \u00e0 votre site. Si vous souhaitez les afficher dans la grid des produits, et pouvoir filtrer les produits via cet attribut, voici comment proc\u00e9der. Le m\u00e9thode la plus propre est de passer par les observers de Magento, ceci \u00e9vitera de cr\u00e9er des surcharges pouvant [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[246],"tags":[365,327,150,364],"class_list":["post-1026","post","type-post","status-publish","format-standard","hentry","category-magento-2","tag-filtres","tag-grid","tag-magento","tag-produit"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1026","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/comments?post=1026"}],"version-history":[{"count":4,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1026\/revisions"}],"predecessor-version":[{"id":1036,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1026\/revisions\/1036"}],"wp:attachment":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/media?parent=1026"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/categories?post=1026"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/tags?post=1026"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}