[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fN3gKxhsivH2Y1bSPZwXRdTj8Mr3SDh2qNhdL_JPuUpM":22,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":59,"megamenu":140,"footer-db":196,"$fgz4XwvJ6buchm05msOgITOGItUl2Vg1yD49MrDuCc2I":214,"header-db":228},{"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":37,"faq":38,"tldr":54,"readingTime":55,"generatedAt":56,"publishDate":56,"relatedArticles":57,"sourceCategory":58},"Personnaliser le formulaire de création de compte PrestaShop","personnaliser-formulaire-creation-compte-prestashop","Guide complet pour personnaliser le formulaire d'inscription client PrestaShop : ajout de champs, hooks, validation et module custom. Compatible 1.7 et 8.x.","developpement",[28,29,30,31,32],"formulaire inscription","module prestashop","hook customer","personnalisation compte","FormField","intermediaire",[35,36],"1.7","8.x","\u003Ch2>Pourquoi personnaliser le formulaire d'inscription PrestaShop\u003C\u002Fh2>\n\u003Cp>Le formulaire de création de compte par défaut de PrestaShop collecte les informations essentielles : nom, prénom, email et mot de passe. Mais dans de nombreux contextes B2B ou métiers spécifiques, ce formulaire est insuffisant. On peut avoir besoin d'un numéro SIRET, d'un code client, d'un champ société obligatoire, ou de toute autre donnée métier dès l'inscription.\u003C\u002Fp>\n\u003Cp>Plutôt que de modifier les fichiers core — ce qui compromettrait toute mise à jour future — la bonne approche consiste à développer un module qui exploite le système de hooks natifs de PrestaShop.\u003C\u002Fp>\n\u003Ch2>Architecture du formulaire d'inscription\u003C\u002Fh2>\n\u003Cp>Avant de coder, il faut comprendre comment PrestaShop gère ce formulaire.\u003C\u002Fp>\n\u003Ch3>Le flow côté contrôleur\u003C\u002Fh3>\n\u003Cp>Le formulaire de création de compte est géré par le contrôleur \u003Ccode>AuthController\u003C\u002Fcode> (fichier \u003Ccode>controllers\u002Ffront\u002FAuthController.php\u003C\u002Fcode>). Ce contrôleur utilise le composant \u003Ccode>CustomerForm\u003C\u002Fcode> situé dans \u003Ccode>src\u002FCore\u002FForm\u002F\u003C\u002Fcode> (PrestaShop 1.7+) qui implémente le pattern \u003Cstrong>FormField\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Cp>Le rendu du formulaire passe par le template Smarty :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-\">\nthemes\u002Fvotre-theme\u002Ftemplates\u002Fcustomer\u002F_partials\u002Fcustomer-form.tpl\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Les hooks disponibles\u003C\u002Fh3>\n\u003Cp>PrestaShop expose plusieurs hooks pour intervenir sur le formulaire client :\u003C\u002Fp>\n\u003Ctr>\u003Cth>Hook\u003C\u002Fth>\u003Cth>Rôle\u003C\u002Fth>\u003Cth>Contexte\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`additionalCustomerFormFields`\u003C\u002Fth>\u003Cth>Ajouter des champs au formulaire\u003C\u002Fth>\u003Cth>Front-office\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`actionSubmitAccountBefore`\u003C\u002Fth>\u003Cth>Intercepter avant la soumission\u003C\u002Fth>\u003Cth>Validation\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`actionCustomerAccountAdd`\u003C\u002Fth>\u003Cth>Réagir après la création du compte\u003C\u002Fth>\u003Cth>Post-traitement\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`actionObjectCustomerAddAfter`\u003C\u002Fth>\u003Cth>Après l'insertion en base\u003C\u002Fth>\u003Cth>Persistance\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`validateCustomerFormFields`\u003C\u002Fth>\u003Cth>Valider les champs additionnels\u003C\u002Fth>\u003Cth>Validation custom\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ch2>Créer un module de personnalisation du formulaire\u003C\u002Fh2>\n\u003Ch3>Structure du module\u003C\u002Fh3>\n\u003Cp>Voici la structure minimale d'un module qui ajoute des champs au formulaire d'inscription :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-\">\nmon_module_customer_form\u002F\n├── mon_module_customer_form.php\n├── sql\u002F\n│   ├── install.sql\n│   └── uninstall.sql\n├── views\u002F\n│   └── templates\u002F\n│       └── hook\u002F\n└── logo.png\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Le fichier principal du module\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-php\">\n&lt;?php\n\nif (!defined('_PS_VERSION_')) {\n    exit;\n}\n\nclass Mon_Module_Customer_Form extends Module\n{\n    public function __construct()\n    {\n        $this-&gt;name = 'mon_module_customer_form';\n        $this-&gt;tab = 'front_office_features';\n        $this-&gt;version = '1.0.0';\n        $this-&gt;author = 'Alexandre Carette';\n        $this-&gt;need_instance = 0;\n        $this-&gt;ps_versions_compliancy = [\n            'min' =&gt; '1.7.0.0',\n            'max' =&gt; '8.99.99',\n        ];\n\n        parent::__construct();\n\n        $this-&gt;displayName = $this-&gt;l('Personnalisation formulaire client');\n        $this-&gt;description = $this-&gt;l('Ajoute des champs personnalisés au formulaire de création de compte.');\n    }\n\n    public function install()\n    {\n        return parent::install()\n            && $this-&gt;registerHook('additionalCustomerFormFields')\n            && $this-&gt;registerHook('validateCustomerFormFields')\n            && $this-&gt;registerHook('actionObjectCustomerAddAfter')\n            && $this-&gt;registerHook('actionObjectCustomerUpdateAfter')\n            && $this-&gt;installDb();\n    }\n\n    private function installDb()\n    {\n        $sql = 'CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'customer_custom_fields` (\n            `id_customer` INT(10) UNSIGNED NOT NULL,\n            `company_siret` VARCHAR(14) DEFAULT NULL,\n            `customer_code` VARCHAR(50) DEFAULT NULL,\n            `activity_sector` VARCHAR(100) DEFAULT NULL,\n            PRIMARY KEY (`id_customer`)\n        ) ENGINE=' . _MYSQL_ENGINE_ . ' DEFAULT CHARSET=utf8mb4;';\n\n        return Db::getInstance()-&gt;execute($sql);\n    }\n\n    public function uninstall()\n    {\n        return parent::uninstall()\n            && Db::getInstance()-&gt;execute(\n                'DROP TABLE IF EXISTS `' . _DB_PREFIX_ . 'customer_custom_fields`'\n            );\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Ajouter des champs avec le hook `additionalCustomerFormFields`\u003C\u002Fh3>\n\u003Cp>C'est le hook central. Il permet d'injecter des objets \u003Ccode>FormField\u003C\u002Fcode> directement dans le formulaire natif, sans modifier le template :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function hookAdditionalCustomerFormFields($params)\n{\n    $extraFields = [];\n\n    \u002F\u002F Champ SIRET (optionnel)\n    $fieldSiret = (new FormField())\n        -&gt;setName('company_siret')\n        -&gt;setType('text')\n        -&gt;setLabel($this-&gt;l('Numéro SIRET'))\n        -&gt;setRequired(false)\n        -&gt;addConstraint('isGenericName');\n\n    $extraFields['company_siret'] = $fieldSiret;\n\n    \u002F\u002F Champ code client (optionnel)\n    $fieldCode = (new FormField())\n        -&gt;setName('customer_code')\n        -&gt;setType('text')\n        -&gt;setLabel($this-&gt;l('Code client (si existant)'))\n        -&gt;setRequired(false);\n\n    $extraFields['customer_code'] = $fieldCode;\n\n    \u002F\u002F Liste déroulante secteur d'activité\n    $fieldSector = (new FormField())\n        -&gt;setName('activity_sector')\n        -&gt;setType('select')\n        -&gt;setLabel($this-&gt;l('Secteur d\\'activité'))\n        -&gt;setRequired(true)\n        -&gt;addAvailableValue('', $this-&gt;l('-- Choisir --'))\n        -&gt;addAvailableValue('retail', $this-&gt;l('Commerce de détail'))\n        -&gt;addAvailableValue('wholesale', $this-&gt;l('Commerce de gros'))\n        -&gt;addAvailableValue('services', $this-&gt;l('Services'))\n        -&gt;addAvailableValue('industry', $this-&gt;l('Industrie'))\n        -&gt;addAvailableValue('other', $this-&gt;l('Autre'));\n\n    $extraFields['activity_sector'] = $fieldSector;\n\n    \u002F\u002F Pré-remplir si le client existe déjà (édition de profil)\n    if ($this-&gt;context-&gt;customer && $this-&gt;context-&gt;customer-&gt;id) {\n        $data = $this-&gt;getCustomerData($this-&gt;context-&gt;customer-&gt;id);\n        if ($data) {\n            $fieldSiret-&gt;setValue($data['company_siret'] ?? '');\n            $fieldCode-&gt;setValue($data['customer_code'] ?? '');\n            $fieldSector-&gt;setValue($data['activity_sector'] ?? '');\n        }\n    }\n\n    return $extraFields;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Valider les champs personnalisés\u003C\u002Fh3>\n\u003Cp>Le hook \u003Ccode>validateCustomerFormFields\u003C\u002Fcode> permet d'ajouter une logique de validation métier :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function hookValidateCustomerFormFields($params)\n{\n    $errors = [];\n    $formFields = $params['fields'];\n\n    \u002F\u002F Validation du SIRET (14 chiffres si renseigné)\n    if (isset($formFields['company_siret'])) {\n        $siret = $formFields['company_siret']-&gt;getValue();\n        if (!empty($siret) && !preg_match('\u002F^\\d{14}$\u002F', $siret)) {\n            $formFields['company_siret']-&gt;addError(\n                $this-&gt;l('Le numéro SIRET doit contenir exactement 14 chiffres.')\n            );\n        }\n    }\n\n    \u002F\u002F Vérifier que le secteur d'activité est bien sélectionné\n    if (isset($formFields['activity_sector'])) {\n        $sector = $formFields['activity_sector']-&gt;getValue();\n        if (empty($sector)) {\n            $formFields['activity_sector']-&gt;addError(\n                $this-&gt;l('Veuillez sélectionner votre secteur d\\'activité.')\n            );\n        }\n    }\n\n    return $formFields;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Sauvegarder les données en base\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function hookActionObjectCustomerAddAfter($params)\n{\n    $this-&gt;saveCustomerData($params['object']-&gt;id);\n}\n\npublic function hookActionObjectCustomerUpdateAfter($params)\n{\n    $this-&gt;saveCustomerData($params['object']-&gt;id);\n}\n\nprivate function saveCustomerData($idCustomer)\n{\n    $siret = Tools::getValue('company_siret', '');\n    $code = Tools::getValue('customer_code', '');\n    $sector = Tools::getValue('activity_sector', '');\n\n    \u002F\u002F Upsert : INSERT ... ON DUPLICATE KEY UPDATE\n    $sql = 'INSERT INTO `' . _DB_PREFIX_ . 'customer_custom_fields`\n            (`id_customer`, `company_siret`, `customer_code`, `activity_sector`)\n            VALUES ('\n            . (int) $idCustomer . ', '\n            . '\\'' . pSQL($siret) . '\\', '\n            . '\\'' . pSQL($code) . '\\', '\n            . '\\'' . pSQL($sector) . '\\')'\n            . ' ON DUPLICATE KEY UPDATE '\n            . '`company_siret` = \\'' . pSQL($siret) . '\\', '\n            . '`customer_code` = \\'' . pSQL($code) . '\\', '\n            . '`activity_sector` = \\'' . pSQL($sector) . '\\'';\n\n    return Db::getInstance()-&gt;execute($sql);\n}\n\nprivate function getCustomerData($idCustomer)\n{\n    return Db::getInstance()-&gt;getRow(\n        'SELECT * FROM `' . _DB_PREFIX_ . 'customer_custom_fields`\n         WHERE `id_customer` = ' . (int) $idCustomer\n    );\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Afficher les champs custom dans le back-office\u003C\u002Fh2>\n\u003Cp>Pour que les données soient visibles dans la fiche client du back-office, exploitez le hook \u003Ccode>displayAdminCustomers\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function hookDisplayAdminCustomers($params)\n{\n    $idCustomer = $params['id_customer'];\n    $data = $this-&gt;getCustomerData($idCustomer);\n\n    if (!$data) {\n        return '';\n    }\n\n    $this-&gt;context-&gt;smarty-&gt;assign([\n        'siret' =&gt; $data['company_siret'],\n        'customer_code' =&gt; $data['customer_code'],\n        'activity_sector' =&gt; $data['activity_sector'],\n    ]);\n\n    return $this-&gt;display(__FILE__, 'views\u002Ftemplates\u002Fhook\u002Fadmin-customer.tpl');\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Spécificités PrestaShop 8.x\u003C\u002Fh2>\n\u003Cp>Sur PrestaShop 8.x, le système de formulaires a évolué avec l'adoption plus large de Symfony. Quelques points de vigilance :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>**Les hooks fonctionnent toujours** : `additionalCustomerFormFields` reste la méthode recommandée pour le front-office. La rétrocompatibilité est maintenue.\u003C\u002Fli>\n\u003Cli>**Back-office Symfony** : pour personnaliser le formulaire client côté admin dans PS 8.x, privilégiez les **form extensions** Symfony plutôt que les hooks legacy.\u003C\u002Fli>\n\u003Cli>**Validation** : PrestaShop 8.x utilise les contraintes Symfony Validator en plus des validations legacy. Votre module peut supporter les deux.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F\u002F Exemple d'extension de formulaire pour le back-office PS 8.x\nuse Symfony\\Component\\Form\\AbstractTypeExtension;\nuse PrestaShopBundle\\Form\\Admin\\Type\\CustomerType;\n\nclass CustomerTypeExtension extends AbstractTypeExtension\n{\n    public static function getExtendedTypes(): iterable\n    {\n        yield CustomerType::class;\n    }\n\n    public function buildForm(FormBuilderInterface $builder, array $options): void\n    {\n        $builder-&gt;add('company_siret', TextType::class, [\n            'label' =&gt; 'SIRET',\n            'required' =&gt; false,\n            'constraints' =&gt; [\n                new Regex([\n                    'pattern' =&gt; '\u002F^\\d{14}$\u002F',\n                    'message' =&gt; 'Le SIRET doit contenir 14 chiffres.',\n                ]),\n            ],\n        ]);\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Bonnes pratiques\u003C\u002Fh2>\n\u003Ch3>Ce qu'il faut faire\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>**Utiliser les hooks natifs** plutôt que des overrides de contrôleur ou de template.\u003C\u002Fli>\n\u003Cli>**Stocker dans une table dédiée** plutôt que d'altérer `ps_customer` directement. Cela préserve la compatibilité avec les mises à jour.\u003C\u002Fli>\n\u003Cli>**Valider côté serveur** systématiquement, même si vous ajoutez une validation JavaScript en front.\u003C\u002Fli>\n\u003Cli>**Utiliser `pSQL()`** pour échapper toutes les entrées utilisateur dans vos requêtes.\u003C\u002Fli>\n\u003Cli>**Penser à l'édition de profil** : le hook `additionalCustomerFormFields` est aussi appelé sur la page Mon Compte.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Ce qu'il ne faut pas faire\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>**Ne jamais modifier `AuthController.php`** directement.\u003C\u002Fli>\n\u003Cli>**Ne pas surcharger `customer-form.tpl`** si le hook suffit — les surcharges de template compliquent les mises à jour de thème.\u003C\u002Fli>\n\u003Cli>**Ne pas stocker de données sensibles** (pièce d'identité, coordonnées bancaires) sans chiffrement côté base.\u003C\u002Fli>\n\u003Cli>**Ne pas oublier le RGPD** : tout champ supplémentaire collectant des données personnelles doit être déclaré dans votre politique de confidentialité et supprimable sur demande.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Aller plus loin : rendre les champs configurables\u003C\u002Fh2>\n\u003Cp>Pour un module réutilisable, ajoutez une page de configuration dans le back-office permettant de choisir quels champs afficher, lesquels sont obligatoires, et leur ordre d'apparition. Stockez cette configuration avec \u003Ccode>Configuration::updateValue()\u003C\u002Fcode> et chargez-la dans votre hook \u003Ccode>additionalCustomerFormFields\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Cette approche transforme un module sur-mesure en un outil générique que vous pouvez déployer sur plusieurs boutiques sans toucher au code.\u003C\u002Fp>",[39,42,45,48,51],{"q":40,"a":41},"Comment ajouter un champ obligatoire au formulaire d'inscription PrestaShop sans modifier le core ?","Créez un module qui utilise le hook `additionalCustomerFormFields`. Ce hook vous permet d'injecter des objets `FormField` avec `->setRequired(true)`. PrestaShop se charge automatiquement de bloquer la soumission si le champ est vide, et d'afficher le message d'erreur. Aucune modification du contrôleur ou du template n'est nécessaire.",{"q":43,"a":44},"Où stocker les données des champs personnalisés du formulaire client PrestaShop ?","La bonne pratique est de créer une table dédiée (par exemple `ps_customer_custom_fields`) liée par `id_customer`. Modifier directement la table `ps_customer` est déconseillé car cela peut provoquer des conflits lors des mises à jour de PrestaShop ou avec d'autres modules. Utilisez le hook `actionObjectCustomerAddAfter` pour sauvegarder les données après la création du compte.",{"q":46,"a":47},"Le hook additionalCustomerFormFields fonctionne-t-il avec PrestaShop 8 ?","Oui, le hook `additionalCustomerFormFields` est toujours fonctionnel et recommandé dans PrestaShop 8.x pour le front-office. La rétrocompatibilité est assurée. En revanche, pour personnaliser le formulaire client dans le back-office de PS 8.x, privilégiez les form extensions Symfony qui s'intègrent mieux à la nouvelle architecture admin.",{"q":49,"a":50},"Comment valider un numéro SIRET dans un champ personnalisé du formulaire d'inscription ?","Utilisez le hook `validateCustomerFormFields` pour ajouter une validation serveur. Un SIRET valide contient exactement 14 chiffres. Vérifiez avec une regex `preg_match('\u002F^\\d{14}$\u002F', $siret)`. En complément, vous pouvez vérifier la clé de Luhn du SIRET pour une validation plus stricte, et appeler l'API INSEE\u002FSirene pour confirmer l'existence de l'entreprise.",{"q":52,"a":53},"Comment pré-remplir les champs personnalisés quand le client modifie son profil ?","Dans le hook `additionalCustomerFormFields`, vérifiez si le client est connecté avec `$this->context->customer->id`. Si oui, récupérez ses données en base et utilisez `->setValue()` sur chaque `FormField` pour pré-remplir les valeurs. Le même hook est appelé à la création et à l'édition du profil, il suffit donc de gérer les deux cas dans la même méthode.","Pour personnaliser le formulaire d'inscription PrestaShop, créez un module exploitant le hook `additionalCustomerFormFields` qui injecte des champs via l'API FormField, avec validation serveur et stockage dans une table dédiée — sans jamais modifier le core.",7,"2026-03-21T15:00:07.000Z",[],"PrestaShop pour les développeurs",{"columns":60},[61,77,107,128],{"title":62,"links":63},"Plateforme",[64,68,71,74],{"label":65,"href":66,"external":67},"Offre Starter (2 500 €)","\u002Foffre-starter",false,{"label":69,"href":70,"external":67},"Devenir Ambassadeur","\u002Fambassadeur",{"label":72,"href":73,"external":67},"Modules PrestaShop","\u002Fmodules",{"label":75,"href":76,"external":20},"CodeMyShop.com","https:\u002F\u002Fcodemyshop.com",{"title":78,"links":79},"Le Synedre",[80,83,86,89,92,95,98,101,104],{"label":81,"href":82,"external":67},"L'histoire","\u002Fsynedre",{"label":84,"href":85,"external":67},"Constitution","\u002Fsynedre\u002Fconstitution",{"label":87,"href":88,"external":67},"L'équipe","\u002Fequipe",{"label":90,"href":91,"external":67},"Le réacteur en direct","\u002Freacteur",{"label":93,"href":94,"external":67},"Le Drill (entraînement)","\u002Fdrill",{"label":96,"href":97,"external":67},"Protocole de réunion","\u002Fsynedre\u002Freunion",{"label":99,"href":100,"external":67},"Les agents IA","\u002Fagents-ia",{"label":102,"href":103,"external":67},"La Conduite","\u002Fsynedre\u002Fconduite",{"label":105,"href":106,"external":67},"Charte plateforme","\u002Fsynedre\u002Fcharte",{"title":108,"links":109},"Ressources",[110,113,116,119,122,125],{"label":111,"href":112,"external":67},"Blog","\u002Fblog",{"label":114,"href":115,"external":67},"Academy","\u002Facademy",{"label":117,"href":118,"external":67},"Dictionnaire","\u002Fdictionnaire",{"label":120,"href":121,"external":67},"Expertise PrestaShop","\u002Fexpertise",{"label":123,"href":124,"external":67},"Flywheel","\u002Fflywheel",{"label":126,"href":127,"external":67},"Manifeste","\u002Fmanifeste",{"title":129,"links":130},"À propos",[131,134,137],{"label":132,"href":133,"external":67},"Alexandre Carette","\u002Fa-propos",{"label":135,"href":136,"external":67},"Dossier de presse","\u002Fpresse",{"label":138,"href":139,"external":67},"Contact","\u002Fcontact",{"items":141},[142,151,157,163,171,179,185,191],{"id":143,"type":144,"label":145,"href":121,"icon":147,"description":147,"badge":147,"groupTitle":147,"style":147,"gridColumns":147,"cssClass":147,"psCategoryId":147,"showPsChildren":67,"position":148,"children":149,"psChildren":150},41,"link",{"fr":146},"Expertise",null,0,[],[],{"id":152,"type":144,"label":153,"href":112,"icon":147,"description":147,"badge":147,"groupTitle":147,"style":147,"gridColumns":147,"cssClass":147,"psCategoryId":147,"showPsChildren":67,"position":154,"children":155,"psChildren":156},42,{"fr":111},1,[],[],{"id":158,"type":144,"label":159,"href":73,"icon":147,"description":147,"badge":147,"groupTitle":147,"style":147,"gridColumns":147,"cssClass":147,"psCategoryId":147,"showPsChildren":67,"position":160,"children":161,"psChildren":162},43,{"fr":72},2,[],[],{"id":164,"type":144,"label":165,"href":167,"icon":147,"description":147,"badge":147,"groupTitle":147,"style":147,"gridColumns":147,"cssClass":147,"psCategoryId":147,"showPsChildren":67,"position":168,"children":169,"psChildren":170},44,{"fr":166},"Outils IA","\u002Foutils-ia",3,[],[],{"id":172,"type":144,"label":173,"href":66,"icon":147,"description":147,"badge":147,"groupTitle":147,"style":175,"gridColumns":147,"cssClass":147,"psCategoryId":147,"showPsChildren":67,"position":176,"children":177,"psChildren":178},45,{"fr":174},"Offre Starter ✨",{"highlight":20},4,[],[],{"id":180,"type":144,"label":181,"href":115,"icon":147,"description":147,"badge":147,"groupTitle":147,"style":147,"gridColumns":147,"cssClass":147,"psCategoryId":147,"showPsChildren":67,"position":182,"children":183,"psChildren":184},46,{"fr":114},5,[],[],{"id":186,"type":144,"label":187,"href":133,"icon":147,"description":147,"badge":147,"groupTitle":147,"style":147,"gridColumns":147,"cssClass":147,"psCategoryId":147,"showPsChildren":67,"position":188,"children":189,"psChildren":190},47,{"fr":129},6,[],[],{"id":192,"type":144,"label":193,"href":139,"icon":147,"description":147,"badge":147,"groupTitle":147,"style":147,"gridColumns":147,"cssClass":147,"psCategoryId":147,"showPsChildren":67,"position":55,"children":194,"psChildren":195},48,{"fr":138},[],[],{"footer":197},{"theme":198,"description":147,"hours":147,"logo":199,"contact":202,"social":203,"bottomBar":213},"dark",{"src":200,"href":201,"alt":132},"\u002Flogo-ac.svg","\u002F",{"email":147,"phone":147,"address":147,"cta":147},[204,207,210],{"platform":205,"href":206,"label":205},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":208,"href":209,"label":208},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":211,"href":212,"label":211},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":147},{"academy":215,"blog":216,"expertise":227},[],[217,221,224],{"title":218,"url":219,"score":154,"type":220},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back","blog",{"title":222,"url":223,"score":154,"type":220},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":225,"url":226,"score":154,"type":220},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[],{"header":229},{"logo":230,"topBar":233,"contactEmail":236,"features":237,"navBar":147},{"src":200,"alt":231,"text":132,"href":201,"class":232},"Alexandre Carette — Architecte E-commerce Souverain","h-10 w-10",{"message":147,"showLanguages":67,"align":234,"languages":235},"left",[],"contact@alexandrecarette.fr",{"showSearch":67,"showWishlist":67,"showLogin":20,"showContact":67,"showCart":67,"stickyHeader":20,"headerLayout":238},"inline"]