{"id":1779,"date":"2018-04-13T14:28:02","date_gmt":"2018-04-13T12:28:02","guid":{"rendered":"https:\/\/www.h-hennes.fr\/blog\/?p=1779"},"modified":"2018-11-22T18:08:59","modified_gmt":"2018-11-22T16:08:59","slug":"prestashop-modifier-les-listings-dans-ladministration","status":"publish","type":"post","link":"https:\/\/www.h-hennes.fr\/blog\/2018\/04\/13\/prestashop-modifier-les-listings-dans-ladministration\/","title":{"rendered":"Prestashop : Modifier les listings dans l&rsquo;administration"},"content":{"rendered":"<p>En compl\u00e9ment d&rsquo;un de mes pr\u00e9c\u00e9dents articles sur <a href=\"https:\/\/www.h-hennes.fr\/blog\/2017\/11\/15\/prestashop-1-7-ajouter-des-champs-dans-le-listing-produit-admin\/\">comment ajouter des nouveaux champs dans le listing des produits<\/a> ( pour prestashop 1.7 ), nous allons voir comment effectuer cette action sur les autres controllers de l&rsquo;administration.<\/p>\n<p>Les listing des controllers concern\u00e9s sont ceux qui utilisent encore l&rsquo;ancienne infrastructure et les anciennes m\u00e9thodes ( Clients, adresses, commandes , employ\u00e9s &#8230; )<\/p>\n<p>Ce tutoriel fonctionne \u00e0 partir de la version 1.6.0.2 de Prestashop et utilise le hook dynamique <strong>action.$this-&gt;controller_name.ListingFieldsModifier<\/strong><\/p>\n<p>Pour les versions inf\u00e9rieures il sera n\u00e9cessaire de faire un override du controller concern\u00e9 et d&rsquo;ajouter les informations directement \u00e0 la suite des param\u00e8tres de classe<br \/>\n$this-&gt;_select,<br \/>\n$this-&gt;_join,<br \/>\n$this-&gt;_where<br \/>\n&#8230;<\/p>\n<p>Ex\u00e9cut\u00e9 par via le code suivant dans la fonction <strong>getList<\/strong> de la classe <strong>AdminController<\/strong><\/p>\n<pre lang=\"php\" escaped=\"true\">Hook::exec('action'.$this-&gt;controller_name.'ListingFieldsModifier', array(\r\n'select' =&gt; &amp;$this-&gt;_select,\r\n'join' =&gt; &amp;$this-&gt;_join,\r\n'where' =&gt; &amp;$this-&gt;_where,\r\n'group_by' =&gt; &amp;$this-&gt;_group,\r\n'order_by' =&gt; &amp;$this-&gt;_orderBy,\r\n'order_way' =&gt; &amp;$this-&gt;_orderWay,\r\n'fields' =&gt; &amp;$this-&gt;fields_list,\r\n));\r\n<\/pre>\n<p>Les param\u00e8tres sont pass\u00e9s par r\u00e9f\u00e9rence au hook ce qui permets de modifier directement les variables qui seront appell\u00e9es depuis un module.<\/p>\n<p>Les \u00e9l\u00e9ments <em>select, join, where, group_by, order_by , order_way<\/em> permettent de modifier la requ\u00eate de r\u00e9cup\u00e9ration de la liste des entit\u00e9s.<br \/>\nAlors que le champ <em>fields<\/em> est un tableau qui regroupe l&rsquo;ensemble des colonnes qui seront affich\u00e9es dans la liste.<\/p>\n<p>Pour tester tout cela nous allons faire un module <strong>hh_admin<\/strong> dont le but sera le suivant :<\/p>\n<p>&#8211; Ajouter 2 nouvelles colonnes dans le listing des clients et supprimer 2 existants :<\/p>\n<p>Le module devra donc impl\u00e9menter le hook suivant :<\/p>\n<ul>\n<li>action<strong>AdminCustomers<\/strong>ListingFieldsModifier<\/li>\n<\/ul>\n<p>Pour modifier le listing client le contenu sera le suivant :<\/p>\n<pre lang=\"php\" escaped=\"true\">    \/**\r\n     * Ajout de champs dans le listing des clients\r\n     * @param type $params\r\n     *\/\r\n    public function hookActionAdminCustomersListingFieldsModifier($params)\r\n    {\r\n        \/\/Pour l'exemple on va ajouter 2 champs dans le listing\r\n        \r\n        \/\/ champ simple texte : date d'inscription \u00e0 la newsletter ( newsletter_date_add dans la table customer )\r\n        $params['fields']['newsletter_date_add'] = array(\r\n            'title' =&gt; $this-&gt;l('Date souscription Newsletter')\r\n        );\r\n        \r\n        \/\/Champ un peu plus \"complexe\" groupe par d\u00e9faut  select ( id_default_group dans la table customer et r\u00e9cup\u00e9ration des noms des groupes via une jointure )\r\n        $params['select'] .= ' ,grl.name as default_group_name '; \/\/Ajout du champ dans la requ\u00eate select\r\n        $params['join'] .= 'LEFT JOIN '._DB_PREFIX_.'group_lang grl ON (a.id_default_group = grl.id_group )'; \/\/Jointure avec la table des groupes\r\n        \r\n\t\/\/R\u00e9cup\u00e9ration de la liste des groupes via la m\u00e9thode prestashop + cr\u00e9ation d'un tableau sous la forme id_group =&gt; name \r\n\t$groups = Group::getGroups($this-&gt;context-&gt;language-&gt;id); \r\n        $groupsList = array();\r\n        foreach( $groups as $group)\r\n            $groupsList[$group['id_group']] = $group['name'];\r\n        \r\n        \/\/Ajout du nouveau champ \u00e0 afficher dans le listing\r\n        $params['fields']['default_group_name'] = array(\r\n            'title' =&gt; $this-&gt;l('Groupe par d\u00e9faut'),\r\n            'type' =&gt; 'select',\r\n            'list' =&gt; $groupsList,\r\n            'filter_key' =&gt; 'a!id_default_group' \/\/Cl\u00e9 de filtrage dans la requ\u00eate sous la forme \"NomTable!champ\"  \r\n        );\r\n\t\t\r\n\t\/\/Suppression des champs \"Titre\",\"Optin\"\r\n        unset($params['fields']['title']);\r\n        unset($params['fields']['optin']);\r\n    }\r\n<\/pre>\n<p>Une fois le code impl\u00e9ment\u00e9 nous voyons bien nos 2 nouvelles colonnes dans la liste et les 2 anciennes ont bien disparu.<br \/>\nTout est fonctionnel sans la moindre surcharge \ud83d\ude42<\/p>\n<p><a href=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2018\/04\/listing-client.jpg\" target=\"_blank\"><br \/>\n<img decoding=\"async\" class=\"alignnone size-full wp-image-1782\" src=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2018\/04\/listing-client.jpg\" alt=\"\" width=\"780\" srcset=\"https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2018\/04\/listing-client.jpg 1000w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2018\/04\/listing-client-300x71.jpg 300w, https:\/\/www.h-hennes.fr\/blog\/wp-content\/uploads\/2018\/04\/listing-client-768x183.jpg 768w\" sizes=\"(max-width: 1000px) 100vw, 1000px\" \/><br \/>\n<\/a><\/p>\n<p><strong>Bonus :<\/strong><br \/>\nUne demande r\u00e9currente est \u00e9galement de pouvoir placer les nouveaux champs \u00e0 un autre endroit qu&rsquo;a la fin.<\/p>\n<p>Pour cela j&rsquo;ai cr\u00e9\u00e9 la fonction suivante :<\/p>\n<pre lang=\"php\" escaped=\"true\">\t\r\n    \/**\r\n     * Ajout du nouveau champ apr\u00e8s un autre \r\n     * @param type $fieldParams\r\n     * @param type $afertName\r\n     * @param type $fieldsArray\r\n     *\/\r\n    public function addNewFieldAfter($fieldParams,$afterName,array &amp;$fieldsArray)\r\n    {\r\n        \r\n        if (array_key_exists($afterName, $fieldsArray)) {\r\n            $pos = array_search($afterName, array_keys($fieldsArray));\r\n            $before = array_slice($fieldsArray,0,$pos+1);\r\n            $after = array_slice($fieldsArray, $pos); \r\n            $fieldsArray = array_merge($before,$fieldParams,$after);\r\n            \r\n        } else {\r\n            $fieldsArray = array_merge($fieldsArray,$fieldParams);\r\n        }\r\n    }\r\n<\/pre>\n<p>Il est possible de l&rsquo;utiliser de cette mani\u00e8re :<\/p>\n<pre lang=\"php\" escaped=\"true\"> \/**\r\n     * Ajout de champs dans le listing des clients\r\n     * @param type $params\r\n     *\/\r\n    public function hookActionAdminCustomersListingFieldsModifier($params)\r\n    {\r\n        \r\n        $newField = array( 'default_group_name' =&gt; \r\n\t\tarray(\r\n            'title' =&gt; $this-&gt;l('Groupe par d\u00e9faut'),\r\n            'type' =&gt; 'select',\r\n            'list' =&gt; $groupsList,\r\n            'filter_key' =&gt; 'a!id_default_group' \/\/Cl\u00e9 de filtrage dans la requ\u00eate sous la forme \"NomTable!champ\" \r\n            )\r\n        );\r\n        \r\n        $this-&gt;addNewFieldAfter($newField, 'lastname', $params['fields']);\r\n        \r\n    }\r\n<\/pre>\n<p>Voici le code code complet du module :<\/p>\n<pre lang=\"php\" escaped=\"true\">\r\n<?php\r\nclass HhAdmin extends Module {\r\n\r\n    public function __construct() {\r\n        $this->name = 'hhadmin';\r\n        $this->tab = 'others';\r\n        $this->author = 'hhennes';\r\n        $this->version = '0.1.0';\r\n        $this->need_instance = 0;\r\n        $this->bootstrap = true;\r\n\r\n        parent::__construct();\r\n\r\n        $this->displayName = $this->l('hhadmin');\r\n        $this->description = $this->l('hhadmin description');\r\n        $this->ps_versions_compliancy = array('min' => '1.7.0', 'max' => _PS_VERSION_);\r\n    }\r\n\r\n    \/**\r\n     * @return boolean\r\n     *\/\r\n    public function install() {\r\n        if (!parent::install() \r\n                || !$this->registerHook('actionAdminCustomersListingFieldsModifier')      \r\n        ) {\r\n            return false;\r\n        }\r\n\r\n        return true;\r\n    }\r\n    \r\n    \/**\r\n     * Ajout de champs dans le listing des clients\r\n     * @param type $params\r\n     *\/\r\n    public function hookActionAdminCustomersListingFieldsModifier($params)\r\n    {\r\n        \/\/Pour l'exemple on va ajouter 2 champs dans le listing\r\n        \r\n        \r\n        \/\/ champ simple texte : date d'inscription \u00e0 la newsletter ( dans la table customer )\r\n        $params['fields']['newsletter_date_add'] = array(\r\n            'title' => $this->l('Newsletter subscribe date')\r\n        );\r\n        \r\n        \/\/Champ un peu plus \"complexe\" groupe par d\u00e9faut  select ( id_default_group dans la table customer \r\n        \/\/et r\u00e9cup\u00e9ration des noms des groupes via une jointure )\r\n        $params['select'] .= ' ,grl.name as default_group_name '; \/\/Ajout du champ dans la requ\u00eate select\r\n        $params['join'] .= 'LEFT JOIN '._DB_PREFIX_.'group_lang grl ON (a.id_default_group = grl.id_group )'; \/\/Jointure avec la table des groupes\r\n        $groups = Group::getGroups($this->context->language->id); \/\/R\u00e9cup\u00e9ration de la liste des groupes\r\n        \r\n        $groupsList = array();\r\n        foreach( $groups as $group)\r\n            $groupsList[$group['id_group']] = $group['name'];\r\n        \r\n       \/\/Affichage du nouveau champ ( m\u00e9thode standard)\r\n        \/*$params['fields']['default_group_name'] = array(\r\n            'title' => $this->l('Groupe par d\u00e9faut'),\r\n            'type' => 'select',\r\n            'list' => $groupsList,\r\n            'filter_key' => 'a!id_default_group' \/\/Cl\u00e9 de filtrage dans la requ\u00eate sous la forme \"NomTable!champ\"  \r\n        );*\/\r\n        \r\n\t\t\/\/Ajout du nouveau champ dans une certaine position\r\n        $newField = array( 'default_group_name' => array(\r\n            'title' => $this->l('Groupe par d\u00e9faut'),\r\n            'type' => 'select',\r\n            'list' => $groupsList,\r\n            'filter_key' => 'a!id_default_group' \/\/Cl\u00e9 de filtrage dans la requ\u00eate sous la forme \"NomTable!champ\" \r\n            )\r\n        );\r\n        $this->addNewFieldAfter($newField, 'lastname', $params['fields']);\r\n    }\r\n    \r\n\t \/**\r\n     * Ajout du nouveau champ apr\u00e8s\r\n     * @param type $fieldParams\r\n     * @param type $afertName\r\n     * @param type $fieldsArray\r\n     *\/\r\n    public function addNewFieldAfter($fieldParams,$afterName,array &$fieldsArray)\r\n    {\r\n        \r\n        if (array_key_exists($afterName, $fieldsArray)) {\r\n            $pos = array_search($afterName, array_keys($fieldsArray));\r\n            $before = array_slice($fieldsArray,0,$pos+1);\r\n            $after = array_slice($fieldsArray, $pos); \r\n            $fieldsArray = array_merge($before,$fieldParams,$after);\r\n            \r\n        } else {\r\n            $fieldsArray = array_merge($fieldsArray,$fieldParams);\r\n        }\r\n    }\r\n}\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>En compl\u00e9ment d&rsquo;un de mes pr\u00e9c\u00e9dents articles sur comment ajouter des nouveaux champs dans le listing des produits ( pour prestashop 1.7 ), nous allons voir comment effectuer cette action sur les autres controllers de l&rsquo;administration. Les listing des controllers concern\u00e9s sont ceux qui utilisent encore l&rsquo;ancienne infrastructure et les anciennes m\u00e9thodes ( Clients, adresses, [&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":[1,245],"tags":[512,104,483],"class_list":["post-1779","post","type-post","status-publish","format-standard","hentry","category-non-classe","category-prestashop-2","tag-administration","tag-prestashop","tag-prestashop-1-7","prestashop-1-6","prestashop-1-7","prestashop-1-7-2","prestashop-1-7-6","prestashop-1-7-7","prestashop-1-7-8","prestashop-8-0","prestashop-8-1"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1779","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=1779"}],"version-history":[{"count":5,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1779\/revisions"}],"predecessor-version":[{"id":1785,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/posts\/1779\/revisions\/1785"}],"wp:attachment":[{"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/media?parent=1779"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/categories?post=1779"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.h-hennes.fr\/blog\/wp-json\/wp\/v2\/tags?post=1779"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}