[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fPGXCTz9eapZO9rgG3Sl3ayneOAAdpC1g4dhsGRpT0LQ":22,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":60,"megamenu":141,"$fKifm24oR0eTqWiMkZfYdBjCXRHqpNmUJx5E_uT3XnQI":197,"footer-db":211,"header-db":229},{"theme":4},{"colors":5,"typography":13,"ui":17,"defaultColorMode":21},{"primary":6,"secondary":7,"background":8,"foreground":9,"muted":10,"headerBg":11,"footerBg":12,"topBarBg":9,"topBarText":11},"#4F46E5","#0D9488","#F9FAFB","#111827","#6B7280","#ffffff","#020617",{"fontFamily":14,"fontUrl":15,"baseFontSize":16},"Inter, system-ui, sans-serif","https:\u002F\u002Ffonts.googleapis.com\u002Fcss2?family=Inter:wght@400;500;600;700&family=Playfair+Display:ital,wght@0,400;0,700;0,800;0,900;1,400;1,700&display=swap","16px",{"borderRadius":18,"contentWidth":19,"shadow":20},"lg","7xl",true,"light",{"title":23,"slug":24,"metaDescription":25,"category":26,"tags":27,"difficulty":33,"psVersions":34,"content":38,"faq":39,"tldr":55,"readingTime":56,"generatedAt":57,"publishDate":57,"relatedArticles":58,"sourceCategory":59},"Assigner un groupe client par défaut à l'inscription PrestaShop","assigner-groupe-client-defaut-inscription-prestashop","Comment assigner automatiquement un groupe client par défaut lors de la création de compte PrestaShop. Code complet, erreurs courantes et bonnes pratiques.","developpement",[28,29,30,31,32],"customer","groupe-client","inscription","objectmodel","hook","intermediaire",[35,36,37],"1.6","1.7","8.x","\u003Ch2>Le problème : le groupe par défaut ignoré à la création du compte\u003C\u002Fh2>\n\u003Cp>Lorsqu'on développe un formulaire d'inscription personnalisé sur PrestaShop — par exemple pour permettre au client de choisir son profil (professionnel, revendeur, particulier) — on se heurte souvent à un comportement contre-intuitif : la propriété \u003Ccode>id_default_group\u003C\u002Fcode> du client n'est pas prise en compte si elle est définie \u003Cstrong>après\u003C\u002Fstrong> l'appel à \u003Ccode>$customer->add()\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>C'est un piège classique lié à l'ordre d'exécution des méthodes de l'ObjectModel PrestaShop.\u003C\u002Fp>\n\u003Ch2>Pourquoi ça ne fonctionne pas après `add()`\u003C\u002Fh2>\n\u003Cp>La méthode \u003Ccode>add()\u003C\u002Fcode> de la classe \u003Ccode>Customer\u003C\u002Fcode> persiste l'objet en base de données au moment de l'appel. Toute modification de propriété effectuée après \u003Ccode>add()\u003C\u002Fcode> reste uniquement en mémoire — elle n'est jamais enregistrée en base, sauf si vous appelez ensuite \u003Ccode>update()\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Voici le code \u003Cstrong>incorrect\u003C\u002Fstrong> que l'on rencontre fréquemment :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n$customer = new Customer();\n$customer-&gt;email = $mail;\n$customer-&gt;firstname = $firstname;\n$customer-&gt;lastname = $lastname;\n$customer-&gt;passwd = $passwd;\n$customer-&gt;active = 1;\n$customer-&gt;add(); \u002F\u002F ← INSERT en base ici\n\n$customer-&gt;id_default_group = $group; \u002F\u002F ❌ Trop tard, déjà en base\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>La solution est simple : définir \u003Ccode>id_default_group\u003C\u002Fcode> \u003Cstrong>avant\u003C\u002Fstrong> \u003Ccode>add()\u003C\u002Fcode>, et ne pas oublier le cast \u003Ccode>(int)\u003C\u002Fcode> pour sécuriser la valeur.\u003C\u002Fp>\n\u003Ch2>Solution complète et sécurisée\u003C\u002Fh2>\n\u003Cp>Voici une implémentation robuste, adaptée à PrestaShop 1.6 jusqu'à 8.x :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F**\n * Crée un compte client et l'assigne à un groupe spécifique.\n *\n * @param string $firstname\n * @param string $lastname\n * @param string $email\n * @param string $password\n * @param int    $groupId   ID du groupe par défaut souhaité\n * @return Customer|false\n *\u002F\npublic static function registerAccount($firstname, $lastname, $email, $password, $groupId)\n{\n    \u002F\u002F Vérifier que le groupe existe\n    if (!Group::getGroup((int) $groupId)) {\n        return false;\n    }\n\n    \u002F\u002F Vérifier que l'email n'est pas déjà utilisé\n    if (Customer::customerExists($email)) {\n        return false;\n    }\n\n    $customer = new Customer();\n    $customer-&gt;firstname = pSQL($firstname);\n    $customer-&gt;lastname  = pSQL($lastname);\n    $customer-&gt;email     = pSQL($email);\n    $customer-&gt;active    = 1;\n    $customer-&gt;newsletter = 0;\n\n    \u002F\u002F ✅ Définir le groupe par défaut AVANT add()\n    $customer-&gt;id_default_group = (int) $groupId;\n\n    \u002F\u002F Hashage du mot de passe (adapté à la version)\n    if (version_compare(_PS_VERSION_, '1.7', '&gt;=')) {\n        \u002F\u002F PrestaShop 1.7+ \u002F 8.x : bcrypt via password_hash\n        $customer-&gt;passwd = Tools::hash($password);\n    } else {\n        \u002F\u002F PrestaShop 1.6 : MD5 avec salt (déprécié)\n        $customer-&gt;passwd = md5(_COOKIE_KEY_ . $password);\n    }\n\n    if (!$customer-&gt;add()) {\n        return false;\n    }\n\n    \u002F\u002F Nettoyer les groupes par défaut puis assigner les bons\n    $customer-&gt;cleanGroups();\n    $customer-&gt;addGroups([\n        (int) Configuration::get('PS_CUSTOMER_GROUP'), \u002F\u002F Groupe \"Client\" standard\n        (int) $groupId,\n    ]);\n\n    return $customer;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Points clés de cette implémentation\u003C\u002Fh3>\n\u003Col>\n\u003Cli>**`id_default_group` avant `add()`** : c'est le cœur de la solution. La propriété doit être définie avant la persistance en base.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Col>\n\u003Cli>**Cast `(int)`** : toujours caster `$groupId` en entier pour éviter les injections SQL et les comportements inattendus.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Col>\n\u003Cli>**`cleanGroups()` puis `addGroups()`** : cette combinaison est indispensable. `cleanGroups()` supprime toutes les associations existantes dans `ps_customer_group`, puis `addGroups()` réécrit proprement les appartenances. Sans `cleanGroups()`, le client peut se retrouver avec des groupes fantômes.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Col>\n\u003Cli>**Validation en amont** : on vérifie que le groupe existe et que l'email n'est pas déjà pris avant de créer quoi que ce soit.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Connexion automatique après inscription\u003C\u002Fh2>\n\u003Cp>Si votre formulaire doit connecter le client immédiatement après la création de son compte, voici la méthode propre :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F\u002F Après $customer-&gt;add() réussi\n$context = Context::getContext();\n$context-&gt;customer = $customer;\n$context-&gt;cookie-&gt;id_customer = (int) $customer-&gt;id;\n$context-&gt;cookie-&gt;customer_lastname = $customer-&gt;lastname;\n$context-&gt;cookie-&gt;customer_firstname = $customer-&gt;firstname;\n$context-&gt;cookie-&gt;passwd = $customer-&gt;passwd;\n$context-&gt;cookie-&gt;logged = 1;\n$context-&gt;cookie-&gt;email = $customer-&gt;email;\n$context-&gt;cookie-&gt;is_guest = 0;\n\n\u002F\u002F Mettre à jour le panier si nécessaire\nif ($context-&gt;cart-&gt;id) {\n    $context-&gt;cart-&gt;id_customer = (int) $customer-&gt;id;\n    $context-&gt;cart-&gt;update();\n}\n\n\u002F\u002F Déclencher le hook pour les modules tiers\nHook::exec('actionAuthentication', ['customer' =&gt; $customer]);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\u003Cp>\u003Cstrong>Attention\u003C\u002Fstrong> : ne manipulez jamais directement les cookies avec \u003Ccode>__set()\u003C\u002Fcode> sans définir aussi \u003Ccode>$context->customer\u003C\u002Fcode>. Certains modules et contrôleurs vérifient l'objet \u003Ccode>Customer\u003C\u002Fcode> du contexte, pas uniquement le cookie.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>Hashage du mot de passe : l'évolution entre versions\u003C\u002Fh2>\n\u003Cp>Le hashage MD5 utilisé dans PrestaShop 1.6 est \u003Cstrong>cryptographiquement obsolète\u003C\u002Fstrong>. Voici l'évolution :\u003C\u002Fp>\n\u003Ctr>\u003Cth>Version\u003C\u002Fth>\u003Cth>Méthode\u003C\u002Fth>\u003Cth>Sécurité\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>1.6.x\u003C\u002Fth>\u003Cth>`md5(_COOKIE_KEY_ . $password)`\u003C\u002Fth>\u003Cth>❌ Faible\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>1.7.x\u003C\u002Fth>\u003Cth>`password_hash()` via `Tools::hash()`\u003C\u002Fth>\u003Cth>✅ Bcrypt\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>8.x\u003C\u002Fth>\u003Cth>`password_hash()` via Symfony\u003C\u002Fth>\u003Cth>✅ Bcrypt\u003C\u002Fth>\u003C\u002Ftr>\n\u003Cp>Si vous migrez du code depuis PrestaShop 1.6, remplacez systématiquement le hashage MD5 par \u003Ccode>Tools::hash()\u003C\u002Fcode> ou par les méthodes natives de la classe \u003Ccode>Customer\u003C\u002Fcode> en 8.x.\u003C\u002Fp>\n\u003Ch2>Alternative propre en PrestaShop 8.x : utiliser les hooks\u003C\u002Fh2>\n\u003Cp>Plutôt que de créer une classe statique personnalisée, PrestaShop 8.x permet d'intercepter la création de compte via le hook \u003Ccode>actionCustomerAccountAdd\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function hookActionCustomerAccountAdd(array $params)\n{\n    \u002F** @var Customer $customer *\u002F\n    $customer = $params['newCustomer'];\n\n    \u002F\u002F Lire le groupe souhaité depuis un champ personnalisé du formulaire\n    $groupId = (int) Tools::getValue('customer_group');\n\n    if ($groupId && Group::getGroup($groupId)) {\n        $customer-&gt;id_default_group = $groupId;\n        $customer-&gt;update();\n        $customer-&gt;cleanGroups();\n        $customer-&gt;addGroups([\n            (int) Configuration::get('PS_CUSTOMER_GROUP'),\n            $groupId,\n        ]);\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Cette approche est plus maintenable car elle ne modifie pas le flux d'inscription natif et reste compatible avec les mises à jour de PrestaShop.\u003C\u002Fp>\n\u003Ch2>Erreurs fréquentes à éviter\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>**Oublier `cleanGroups()`** : le client se retrouve membre de groupes non souhaités hérités de la configuration par défaut.\u003C\u002Fli>\n\u003Cli>**Ne pas caster en `(int)`** : risque d'injection ou de valeur vide qui assigne le groupe 0 (inexistant).\u003C\u002Fli>\n\u003Cli>**Confondre `id_default_group` et `addGroups()`** : le premier définit le groupe principal (utilisé pour le calcul des prix), le second gère les appartenances multiples. Les deux sont nécessaires.\u003C\u002Fli>\n\u003Cli>**Modifier `id_default_group` après `add()` sans appeler `update()`** : la modification reste en mémoire PHP et n'est jamais persistée.\u003C\u002Fli>\n\u003C\u002Ful>",[40,43,46,49,52],{"q":41,"a":42},"Pourquoi id_default_group ne fonctionne pas après add() dans PrestaShop ?","La méthode add() de l'ObjectModel exécute un INSERT SQL au moment de l'appel. Toute propriété modifiée après add() reste uniquement en mémoire PHP et n'est jamais enregistrée en base de données. Il faut soit définir id_default_group avant add(), soit appeler update() après la modification.",{"q":44,"a":45},"Quelle est la différence entre id_default_group et addGroups() dans PrestaShop ?","id_default_group définit le groupe principal du client, utilisé pour le calcul des prix, des remises et des règles de catalogue. addGroups() gère les appartenances multiples dans la table ps_customer_group. Un client peut appartenir à plusieurs groupes mais n'a qu'un seul groupe par défaut. Les deux doivent être configurés pour un fonctionnement correct.",{"q":47,"a":48},"Comment assigner automatiquement un groupe client selon le type de compte PrestaShop ?","La méthode recommandée en PrestaShop 8.x est d'utiliser le hook actionCustomerAccountAdd dans un module personnalisé. Ce hook se déclenche après la création du compte et permet de modifier le groupe par défaut via update(), cleanGroups() et addGroups(). Pour les versions 1.6\u002F1.7, il faut surcharger le processus d'inscription en définissant id_default_group avant l'appel à add().",{"q":50,"a":51},"Pourquoi faut-il appeler cleanGroups() avant addGroups() dans PrestaShop ?","Sans cleanGroups(), le client conserve les groupes assignés automatiquement par PrestaShop lors de la création du compte (visiteur, invité, client). addGroups() ajoute des groupes sans supprimer les existants. L'appel à cleanGroups() vide la table ps_customer_group pour ce client, puis addGroups() réécrit proprement les bonnes appartenances.",{"q":53,"a":54},"Le hashage MD5 des mots de passe PrestaShop 1.6 est-il encore sécurisé ?","Non, le hashage MD5 avec salt utilisé dans PrestaShop 1.6 est considéré comme cryptographiquement faible. Depuis PrestaShop 1.7, le framework utilise bcrypt via password_hash(), beaucoup plus résistant aux attaques par force brute. Si vous migrez du code depuis la version 1.6, remplacez md5(_COOKIE_KEY_ . $password) par Tools::hash() ou les méthodes natives de la classe Customer.","Pour assigner un groupe client par défaut à l'inscription PrestaShop, il faut définir `id_default_group` AVANT l'appel à `add()`, puis utiliser `cleanGroups()` suivi de `addGroups()` pour gérer correctement les appartenances multiples.",5,"2026-03-21T14:05:21.000Z",[],"PrestaShop pour les développeurs",{"columns":61},[62,78,108,129],{"title":63,"links":64},"Plateforme",[65,69,72,75],{"label":66,"href":67,"external":68},"Offre Starter (2 500 €)","\u002Foffre-starter",false,{"label":70,"href":71,"external":68},"Devenir Ambassadeur","\u002Fambassadeur",{"label":73,"href":74,"external":68},"Modules PrestaShop","\u002Fmodules",{"label":76,"href":77,"external":20},"CodeMyShop.com","https:\u002F\u002Fcodemyshop.com",{"title":79,"links":80},"Le Synedre",[81,84,87,90,93,96,99,102,105],{"label":82,"href":83,"external":68},"L'histoire","\u002Fsynedre",{"label":85,"href":86,"external":68},"Constitution","\u002Fsynedre\u002Fconstitution",{"label":88,"href":89,"external":68},"L'équipe","\u002Fequipe",{"label":91,"href":92,"external":68},"Le réacteur en direct","\u002Freacteur",{"label":94,"href":95,"external":68},"Le Drill (entraînement)","\u002Fdrill",{"label":97,"href":98,"external":68},"Protocole de réunion","\u002Fsynedre\u002Freunion",{"label":100,"href":101,"external":68},"Les agents IA","\u002Fagents-ia",{"label":103,"href":104,"external":68},"La Conduite","\u002Fsynedre\u002Fconduite",{"label":106,"href":107,"external":68},"Charte plateforme","\u002Fsynedre\u002Fcharte",{"title":109,"links":110},"Ressources",[111,114,117,120,123,126],{"label":112,"href":113,"external":68},"Blog","\u002Fblog",{"label":115,"href":116,"external":68},"Academy","\u002Facademy",{"label":118,"href":119,"external":68},"Dictionnaire","\u002Fdictionnaire",{"label":121,"href":122,"external":68},"Expertise PrestaShop","\u002Fexpertise",{"label":124,"href":125,"external":68},"Flywheel","\u002Fflywheel",{"label":127,"href":128,"external":68},"Manifeste","\u002Fmanifeste",{"title":130,"links":131},"À propos",[132,135,138],{"label":133,"href":134,"external":68},"Alexandre Carette","\u002Fa-propos",{"label":136,"href":137,"external":68},"Dossier de presse","\u002Fpresse",{"label":139,"href":140,"external":68},"Contact","\u002Fcontact",{"items":142},[143,152,158,164,172,180,185,191],{"id":144,"type":145,"label":146,"href":122,"icon":148,"description":148,"badge":148,"groupTitle":148,"style":148,"gridColumns":148,"cssClass":148,"psCategoryId":148,"showPsChildren":68,"position":149,"children":150,"psChildren":151},41,"link",{"fr":147},"Expertise",null,0,[],[],{"id":153,"type":145,"label":154,"href":113,"icon":148,"description":148,"badge":148,"groupTitle":148,"style":148,"gridColumns":148,"cssClass":148,"psCategoryId":148,"showPsChildren":68,"position":155,"children":156,"psChildren":157},42,{"fr":112},1,[],[],{"id":159,"type":145,"label":160,"href":74,"icon":148,"description":148,"badge":148,"groupTitle":148,"style":148,"gridColumns":148,"cssClass":148,"psCategoryId":148,"showPsChildren":68,"position":161,"children":162,"psChildren":163},43,{"fr":73},2,[],[],{"id":165,"type":145,"label":166,"href":168,"icon":148,"description":148,"badge":148,"groupTitle":148,"style":148,"gridColumns":148,"cssClass":148,"psCategoryId":148,"showPsChildren":68,"position":169,"children":170,"psChildren":171},44,{"fr":167},"Outils IA","\u002Foutils-ia",3,[],[],{"id":173,"type":145,"label":174,"href":67,"icon":148,"description":148,"badge":148,"groupTitle":148,"style":176,"gridColumns":148,"cssClass":148,"psCategoryId":148,"showPsChildren":68,"position":177,"children":178,"psChildren":179},45,{"fr":175},"Offre Starter ✨",{"highlight":20},4,[],[],{"id":181,"type":145,"label":182,"href":116,"icon":148,"description":148,"badge":148,"groupTitle":148,"style":148,"gridColumns":148,"cssClass":148,"psCategoryId":148,"showPsChildren":68,"position":56,"children":183,"psChildren":184},46,{"fr":115},[],[],{"id":186,"type":145,"label":187,"href":134,"icon":148,"description":148,"badge":148,"groupTitle":148,"style":148,"gridColumns":148,"cssClass":148,"psCategoryId":148,"showPsChildren":68,"position":188,"children":189,"psChildren":190},47,{"fr":130},6,[],[],{"id":192,"type":145,"label":193,"href":140,"icon":148,"description":148,"badge":148,"groupTitle":148,"style":148,"gridColumns":148,"cssClass":148,"psCategoryId":148,"showPsChildren":68,"position":194,"children":195,"psChildren":196},48,{"fr":139},7,[],[],{"academy":198,"blog":199,"expertise":210},[],[200,204,207],{"title":201,"url":202,"score":155,"type":203},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back","blog",{"title":205,"url":206,"score":155,"type":203},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":208,"url":209,"score":155,"type":203},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[],{"footer":212},{"theme":213,"description":148,"hours":148,"logo":214,"contact":217,"social":218,"bottomBar":228},"dark",{"src":215,"href":216,"alt":133},"\u002Flogo-ac.svg","\u002F",{"email":148,"phone":148,"address":148,"cta":148},[219,222,225],{"platform":220,"href":221,"label":220},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":223,"href":224,"label":223},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":226,"href":227,"label":226},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":148},{"header":230},{"logo":231,"topBar":234,"contactEmail":237,"features":238,"navBar":148},{"src":215,"alt":232,"text":133,"href":216,"class":233},"Alexandre Carette — Architecte E-commerce Souverain","h-10 w-10",{"message":148,"showLanguages":68,"align":235,"languages":236},"left",[],"contact@alexandrecarette.fr",{"showSearch":68,"showWishlist":68,"showLogin":20,"showContact":68,"showCart":68,"stickyHeader":20,"headerLayout":239},"inline"]