{"id":1293,"date":"2016-02-21T14:28:21","date_gmt":"2016-02-21T12:28:21","guid":{"rendered":"http:\/\/www.h-hennes.fr\/blog\/?p=1293"},"modified":"2016-02-21T14:28:21","modified_gmt":"2016-02-21T12:28:21","slug":"magento-ajouter-des-filtres-dans-la-grid-des-produits-dune-categorie","status":"publish","type":"post","link":"https:\/\/www.h-hennes.fr\/blog\/2016\/02\/21\/magento-ajouter-des-filtres-dans-la-grid-des-produits-dune-categorie\/","title":{"rendered":"Magento : Ajouter des filtres dans la grid des produits d&rsquo;une cat\u00e9gorie"},"content":{"rendered":"<p>J&rsquo;ai r\u00e9cemment fait face aux limites de la gestion des produits des cat\u00e9gories dans l&rsquo;administration de Magento.<\/p>\n<p>En effet, dans l&rsquo;onglet \u00ab\u00a0Produits de la cat\u00e9gories\u00a0\u00bb l&rsquo;ensemble des produits associ\u00e9s sont list\u00e9s, et il n&rsquo;est pas possible de filtrer ceux qui ne sont pas visibles en front office ( Produits d\u00e9sactiv\u00e9s, produits non visibles individuellement, ou uniquement dans la recherche )<\/p>\n<p>Pour optimiser cela, nous allons donc rajouter les possibilit\u00e9s suivantes \u00e0 la grid :<\/p>\n<ul>\n<li>Filtrer par status ( Actif \/ Non actif )<\/li>\n<li>Filtrer par visibilit\u00e9 ( Non visible individuellement, Catalogue &#8230; )<\/li>\n<\/ul>\n<p>Pour faire cela nous allons r\u00e9aliser un nouveau module.<br \/>\nJe ne d\u00e9taille pas la cr\u00e9ation du module ni tout ce qui est g\u00e9n\u00e9rique car cet exemple est le m\u00eame que pour le cas suivant : <a href=\"https:\/\/www.h-hennes.fr\/blog\/2015\/06\/29\/magento-ajouter-un-attribut-personnalise-a-la-grid-des-produits-via-les-observers\/\">https:\/\/www.h-hennes.fr\/blog\/2015\/06\/29\/magento-ajouter-un-attribut-personnalise-a-la-grid-des-produits-via-les-observers\/<\/a><\/p>\n<p>Le module qui r\u00e9alise les 2 actions\u00a0 est disponible sur github : <a href=\"https:\/\/github.com\/nenes25\/magento_productGridFilter\" target=\"_blank\">https:\/\/github.com\/nenes25\/magento_productGridFilter<\/a>)<\/p>\n<p>Il serait possible de surcharger directement la grid Mage_Adminhtml_Block_Catalog_Category_Tab_Product\u00a0 pour faire cela, mais magento permets de le faire plus proprement via des Observers.<\/p>\n<p>On va donc utiliser les observers suivants :<\/p>\n<ul>\n<li><strong>core_block_abstract_to_html_before<\/strong><\/li>\n<li><strong>eav_collection_abstract_load_before<\/strong><\/li>\n<\/ul>\n<p>Dans notre fichier Observer, il faudra ensuite mettre les codes suivants :<\/p>\n<pre lang=\"php\" escaped=\"true\"> &lt;?php\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\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if ( $block-&gt;getType() == 'adminhtml\/catalog_category_tab_product') {\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\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Ajout du filtre sur le statut\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $block-&gt;addColumnAfter('status', array(\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'header' =&gt; Mage::helper('hhennes_productgridfilter')-&gt;__('status'),\r\n\u00a0\u00a0\u00a0\u00a0\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\u00a0\u00a0\u00a0\u00a0 'index' =&gt; 'status',\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'type' =&gt; 'options',\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'options' =&gt; Mage::getSingleton('catalog\/product_status')-&gt;getOptionArray(),\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'width' =&gt; '70'\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ),\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'sku');\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/Ajout du filtre sur la visibilit\u00e9\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $block-&gt;addColumnAfter('visibility', array(\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'header' =&gt; Mage::helper('hhennes_productgridfilter')-&gt;__('visibility'),\r\n\u00a0\u00a0\u00a0\u00a0\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\u00a0\u00a0\u00a0\u00a0 'index' =&gt; 'visibility',\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'type' =&gt; 'options',\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'options' =&gt; Mage::getModel('catalog\/product_visibility')-&gt;getOptionArray(),\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'width' =&gt; '70'\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ),\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'sku');\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\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\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\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/Affichage des filtres \"visibilit\u00e9\" et \"statut\" dans le listing des produits des cat\u00e9gories\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (\u00a0\u00a0 is_a($collection, 'Mage_Catalog_Model_Resource_Product_Collection') \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 &amp;&amp; Mage::app()-&gt;getRequest()-&gt;getControllerName() == 'catalog_category') {\r\n\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/R\u00e9cup\u00e9ration des informations de statut\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $collection-&gt;joinAttribute(\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'status', 'catalog_product\/status', 'entity_id', null, 'inner', Mage::app()-&gt;getRequest()-&gt;getParam('store')\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\r\n\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\/\/R\u00e9cup\u00e9ration des informations de visibilit\u00e9\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 $collection-&gt;joinAttribute(\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 'visibility', 'catalog_product\/visibility', 'entity_id', null, 'inner', Mage::app()-&gt;getRequest()-&gt;getParam('store')\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );\r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 }\r\n\u00a0\u00a0\u00a0 }\r\n\r\n}\r\n<\/pre>\n<p>Une fois le code en place, vous aurez bien 2 nouveaux filtres dans l&rsquo;administration, ce qui vous permettra d&rsquo;affiner votre filtrage \ud83d\ude42<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2016\/02\/filtres-grid-category.jpg\" alt=\"Filtre grid produits cat\u00e9gorie\" width=\"671\" height=\"262\" class=\"alignnone size-full wp-image-1294\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2016\/02\/filtres-grid-category.jpg 671w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2016\/02\/filtres-grid-category-300x117.jpg 300w\" sizes=\"auto, (max-width: 671px) 100vw, 671px\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>J&rsquo;ai r\u00e9cemment fait face aux limites de la gestion des produits des cat\u00e9gories dans l&rsquo;administration de Magento. En effet, dans l&rsquo;onglet \u00ab\u00a0Produits de la cat\u00e9gories\u00a0\u00bb l&rsquo;ensemble des produits associ\u00e9s sont list\u00e9s, et il n&rsquo;est pas possible de filtrer ceux qui ne sont pas visibles en front office ( Produits d\u00e9sactiv\u00e9s, produits non visibles individuellement, ou [&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":[348,424,365,150,423],"class_list":["post-1293","post","type-post","status-publish","format-standard","hentry","category-magento-2","tag-admin","tag-categories","tag-filtres","tag-magento","tag-produits"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1293","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=1293"}],"version-history":[{"count":1,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1293\/revisions"}],"predecessor-version":[{"id":1295,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1293\/revisions\/1295"}],"wp:attachment":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/media?parent=1293"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/categories?post=1293"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/tags?post=1293"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}