Segmentez vos clients avec un override groupe client prestashop

PrestaShop, Tips
  • Accueil
  • Blog
  • Segmentez vos clients avec un override groupe client prestashop

Une bonne pratique aujourd’hui sur votre boutique en ligne est de segmenter votre clientèle pour mieux cibler ses besoins et y répondre de manière efficace. Voyons comment faire sur PrestaShop
 

Les groupes clients avec PrestaShop

La solution PrestaShop propose la gestion de groupes clients directement via le backoffice. Pour accéder à la gestion de ces groupes clients, rendez-vous dans l’onglet Clients > Groupes.
groupes-clients-prestashop
Chaque groupe client est paramétrable notamment : son nom, son pourcentage de réduction, son accès au catalogue ht ou ttc, son accès au catalogue avec ou sans prix.
Ok super mais à quoi ça sert donc ?! A segmenter ! C’est-à-dire offrir à vos client fidèles par exemple ou à vos clients physiques – si vous avez une boutique dans la rue – une offre différente et/ou des avantages notamment des réductions.
Une limite de cette fonctionnalité à mon goût, c’est que le client ne peut pas choisir dans quel camp se ranger ce qui peut être pratique dans certains cas si l’offre doit être segmentée et affichée seulement à la bonne clientèle. Pour y remédier ce module est là et permet à vos clients de choisir leur groupe avec ou sans modération du vendeur.
 

Affichage de catégorie ou produit selon le groupe client

On vient de voir comment créer et gérer les groupes clients dans PrestaShop. On va maintenant voir comment afficher telle ou telle catégorie / produits / autres éléments selon le groupe client.
Pour les catégories, c’est très simple car c’est natif. Rendez-vous dans le backoffice dans l’onglet Catalogue > Catégories > cliquez sur « éditer » pour la catégorie voulue puis en bas de page, vous pouvez cocher le ou les groupes qui auront accès à votre gamme de produits. Simple et efficace 🙂
groupes-clients-categories-prestashop
Pour les produits, on ne peut pas restreindre en natif l’accès des produits pour un groupe de clients donné. Il faut donc feinter en attribuant le(s) produit(s) à une catégorie est appliquer la méthode précédemment décrite.
Pour les autres éléments comme un lien vers une page, ou un bloc particulier ou autre, et bien ce n’est pas possible simplement 😉
 

Affichage en fonction du groupe client via un override

On va donc apporter une légère surcouche à PrestaShop sans modifier le coeur pour afficher un élément visible par un seul groupe client. Dans notre exemple, on va afficher un lien dans le compte client seulement si il appartient au groupe dont l’id = 2.
Il faut donc créer le fichier suivant www/override/controllers/MyAccountController.php dans lequel on va coller le code suivant puis enregistrer :

<?php

class MyAccountController extends MyAccountControllerCore
{
 public function process()
 {
 //On assigne la variable $cookie
 global $cookie;
 //On récupère la méthode pour trouver les groupes d'un client
 $groups=Customer::getGroupsStatic($cookie->id_customer);
 //On teste chaque résultat du tableau
 foreach($groups as $group)
 {
 //Si le client appartient au groupe désiré (ici 2)
 if ($group==2)
 {
 //On créé la variable smarty qui servira de test
 self::$smarty->assign('group2','1');
 //On stoppe la boucle, plus besoin de continuer
 break;
 }
 }

 parent::process();

 self::$smarty->assign(array(
 'voucherAllowed' => (int)(Configuration::get('PS_VOUCHERS')),
 'returnAllowed' => (int)(Configuration::get('PS_ORDER_RETURN'))
 ));
 self::$smarty->assign('HOOK_CUSTOMER_ACCOUNT', Module::hookExec('customerAccount'));
 }
}

Concrètement on a déclaré une variable smarty que l’on va pouvoir utiliser dans le fichier d’apparence myaccount.tpl que l’on ouvre puis colle à l’intérieur le code suivant à l’endroit souhaité puis on enregistre ensuite :
{if $group2}
<a href="#">{l s='Lien visible par le groupe 2'}</a>
{/if}

On a donc un lien visible uniquement au client enregistré appartenant au groupe id = 2. Cela peut fonctionne aussi pour les autres pages, il suffit alors de déclarer la variable dans l’override du controller adéquat. Testé fonctionnel sur 1.4.9 et 1.4.10.
 

Comment segmenter mes clients avec PrestaShop 1.7 ?

[Edit du 19/06/2019]
J’ai rédigé un article pour segmenter les clients dans PrestaShop 1.7 pour que vous puissiez utiliser une condition sur les groupes clients partout sur votre boutique en ligne. Le tuto PrestaShop 1.7 est disponible ici :  concernant les groupes clients dans PrestaShop 1.4 ce qui vous permet d’assurer le support de boutiques vieillissantes : Comment segmenter vos clients via des groupes dans PrestaShop 1.7 ?
 
Vous avez trouvé cet article utile alors commentez et partagez votre retour d’expérience ou vos remarques pour apporter votre contribution 🙂

22 commentaires sur “Segmentez vos clients avec un override groupe client prestashop

  1. Bravo ! Ces lignes de code fonctionnent parfaitement même sur Presta 1.5.5. Mais juste une petite question. Si je comprend bien la ligne…
    self::$smarty->assign(‘HOOK_CUSTOMER_ACCOUNT’, Module::hookExec(‘customerAccount’));
    … cette ligne de code indique le contexte d’exécution de la variable SMARTY.
    Donc si je veux l’appliquer dans un autre emplacement, il me suffit de rajouter une ligne en dessous de celle-ci précisant le HOOK cible, voire pour plus de propreté dupliquer le fichier de l’override/front avec un nommage approprié ?
    David

    1. Bonjour,
      J’aimerais utiliser cette variable sur les fiches produits.
      J’ai donc créé un fichier ProductController.php que j’ai placé dans override/controllers/front/
      J’ai remplacé :
      class MyAccountController extends MyAccountControllerCore
      Par :
      class ProductController extends ProductControllerCore
      Par contre, je me demande par quoi je dois remplacer ceci :
      self::$smarty->assign(‘HOOK_CUSTOMER_ACCOUNT’, Module::hookExec(‘customerAccount’));
      Si vous avez une piste, ça serait très aimable ^_^
      Ou alors expliquer plus précisément comment overrider FrontController.php afin d’utiliser ce système partout car les commentaires du dessus sont un peu vagues pour moi :s
      Merci encore pour votre tuto !

      1. @zemzem Bonjour, plus simplement pour les produits, vous les assignez à une catégorie restreinte à un ou plusieurs groupes de clients 😉

  2. Super ! :-)) Merci pour cette astuce pour la globaliser à l’ensemble du site.
    J’ai ajouté d’autres variables correspondant à d’autres groupes et tout fonctionne. Vous m’avez enlevé une sacrée épine du pied !
    Si j’ai un problème de développement sur ma nouvelle plateforme, je penserais à vous en freelance.
    Bonne journée à vous.
    David

  3. @Djo : Si vous voulez afficher un lien seulement pour un groupe dans le product.tpl il faut alors faire comme David Wallon à savoir insérer l’override dans le FrontController.php pour disposer de la variable partout. Car dans mon tuto, le controller en question ne traite que la partie « compte client ».

  4. @Zemzem : Dans ce cas, il vous faut utiliser un override dans le controller produit :
    [code]
    public function process()
    {
    global $smarty;
    $context = Context::getContext();
    $id_lang = $context->cart->id_lang;
    $customer = $context->customer;
    $id_customer = $customer->id;
    $groups = Db::getInstance()->executeS("SELECT " ._DB_PREFIX_. "customer_group.id_group , " ._DB_PREFIX_. "group_lang.name
    FROM " ._DB_PREFIX_. "customer_group
    LEFT JOIN " ._DB_PREFIX_. "group_lang ON " ._DB_PREFIX_. "group_lang.id_group = " ._DB_PREFIX_. "customer_group.id_group
    WHERE " ._DB_PREFIX_. "customer_group.id_customer = ‘$id_customer’ AND " ._DB_PREFIX_. "group_lang.id_lang = ‘$id_lang’");
    if(!isset($groups[0])) $groups = FALSE;
    $smarty->assign(‘customerGroups’, $groups);
    $defaultGroupId = Configuration::get(‘PS_CUSTOMER_GROUP’);
    $defaultGroup = new Group($defaultGroupId);
    $smarty->assign(‘customerDefaultGroup’ , $defaultGroup);
    // Placer la condition dans le .tpl sous le format {if $customerGroups[0].id_group != 4}
    }
    [/code]
    Vous aurez ainsi les variables pour assigner une condition dans le fichier tpl.

  5. Bonjour à tous,
    le code ne semble pas fonctionner pour prestashop 1.6, une idée des modification à apporter à l’override ?
    merciseb

  6. @berenger : Bonjour, il vous faut travailler dans le Frontcontroller pour avoir l’info disponible partout notamment dans le tunnel de vente. Ensuite, ajoutez la condition d’affiche dans le order-carrier.tpl pour afficher un lien selon le groupe client 🙂

  7. Bonjour,
    Votre article est très intéressant. Cependant, en version 1.6, votre méthode pour l’affichage en fonction du groupe client via un override ne fonctionne pas 🙁
    Mon but à moi serait d’afficher un texte au moment du choix des paiements seulement à un groupe client.
    Sauriez-vous comment faire svp ?

  8. Pour que ca fonctionne sous la version prestashop 1.6,
    il faut modifier le controller, pas l’override…
    Il se trouve dans le dossier
    controllers\front\MyAccountController.php
    ca donne :
    class MyAccountControllerCore extends FrontController
    {
    public $auth = true;
    public $php_self = ‘my-account’;
    public $authRedirection = ‘my-account’;
    public $ssl = true;
    public function setMedia()
    {
    parent::setMedia();
    $this->addCSS(_THEME_CSS_DIR_.’my-account.css’);
    }
    /**
    * Assign template vars related to page content
    * @see FrontController::initContent()
    */
    public function initContent()
    {
    parent::initContent();
    $has_address = $this->context->customer->getAddresses($this->context->language->id);
    $this->context->smarty->assign(array(
    ‘has_customer_an_address’ => empty($has_address),
    ‘voucherAllowed’ => (int)CartRule::isFeatureActive(),
    ‘returnAllowed’ => (int)Configuration::get(‘PS_ORDER_RETURN’)
    ));
    $this->context->smarty->assign(‘HOOK_CUSTOMER_ACCOUNT’, Hook::exec(‘displayCustomerAccount’));
    $this->setTemplate(_PS_THEME_DIR_.’my-account.tpl’);
    }
    // debut modif
    public function process()
    {
    //On assigne la variable $cookie
    global $cookie;
    //On récupère la méthode pour trouver les groupes d’un client
    $groups=Customer::getGroupsStatic($cookie->id_customer);
    //On teste chaque résultat du tableau
    foreach($groups as $group)
    {
    //Si le client appartient au groupe désiré (ici 2)
    if ($group==4)
    {
    //On créé la variable smarty qui servira de test
    self::$smarty->assign(‘group2′,’1’);
    //On stoppe la boucle, plus besoin de continuer
    break;
    }
    }
    parent::process();
    self::$smarty->assign(array(
    ‘voucherAllowed’ => (int)(Configuration::get(‘PS_VOUCHERS’)),
    ‘returnAllowed’ => (int)(Configuration::get(‘PS_ORDER_RETURN’))
    ));
    self::$smarty->assign(‘HOOK_CUSTOMER_ACCOUNT’, Module::hookExec(‘customerAccount’));
    }
    // fin mofif
    }

    1. Bonjour Gawell, c’est super d’avoir posté ce snippet qui je pense en aidera plus d’un. Je n’ai pas encore testé mais merci pour la contribution 🙂

  9. Bonjour John, pour ton besoin regardes la réponse de Gawell puis dans le cms.tpl tu peux utiliser par exemple :{if $group2}…{/if}

  10. Bonjour Simon, dans votre cas je pense qu’il serait plus simple de créer vos catégories puis lancer une requête dans votre base de données dans la table ps_category_group 🙂

  11. Bonjour, Est-ce que ce type de modification est applicable dans la 1.7 ? J’ai deux catégories qui ne devraient être accessibles que pour 2 groupes de clients pros.
    J’ai essayé de passer via des modules mais je n’ai rien trouvé de convaincant …
    Merci d’avance pour votre bout de réponse…

    1. Bonjour,
      Merci pour le commentaire,
      Je ne pense pas que ça fonctionne sous PrestaShop 1.7 mais ça vaut le coup d’essayer et d’adapter si besoin.
      A bientôt !

  12. Bonjour,
    Votre article est très intéressant.
    J’ai essayer d’afficher un lien d’un bloc uniquement pour une catégorie de client, en faisant :
    Dans MyAccountController.php
    global $cookie;
    $groups=Customer::getGroupsStatic($cookie->id_customer);
    foreach($groups as $group)
    {if ($group==8)
    {self::$smarty->assign(‘groupe’,’1′);
    break;
    }
    }
    et dans le fichier tpl
    {if $logged}
    {if isset($groupe8) and $groupe8==1}
    pro
    &lt;a href= »{$link-&gt;getCmsCategoryLink(3,’page’)|escape:’html’} »&gt;{l s=’page’}&lt;/a&gt;
    {/if}
    {/if}
    Cépendant ça ne fonctionne pas.
    Prestashop 1.6
    Sauriez-vous comment faire svp

    1. Bonjour David,
      Première chose à voir dans votre cas : que la variable $group remonte bien coté front office.
      Est-ce le cas ?

  13. Bonjour et merci pour ce code,
    je souhaiterai simplement savoir comment l’intégrer au header pour pouvoir afficher ou non un onglet dans un menu en fonction du groupe utilisateur !
    Faut-il modifier ou ajouter une ligne à celle ci ?
    self::$smarty->assign(‘HOOK_CUSTOMER_ACCOUNT’, Module::hookExec(‘customerAccount’));
    sachant que j(utilise un module pour le menu
    Merci d’avance

    1. Bonjour Michael,
      Je viens de mettre à jour l’article pour utiliser la variable partout dans PrestaShop 1.7.
      A bientôt 🙂

Laisser un commentaire

Consultez les autres articles