[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fppiFxGt5RMJDqBb95QR5CHhsy-6o-4db1v5OyFVCDQE":22,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":61,"megamenu":142,"$fG_sKwhVXsRYDaXQSRzBuJ68sJJO-pm5wSfdjRtIm3jI":198,"footer-db":212,"header-db":230},{"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":34,"psVersions":35,"content":39,"faq":40,"tldr":56,"readingTime":57,"generatedAt":58,"publishDate":58,"relatedArticles":59,"sourceCategory":60},"Ajouter un champ personnalisé aux fiches produits PrestaShop","ajouter-champ-personnalise-fiche-produit-prestashop","Guide complet pour créer un champ custom dans PrestaShop : modification base de données, override de classe Product, back-office et template Smarty.","developpement",[28,29,30,31,32,33],"override","ObjectModel","champ personnalisé","Smarty","back-office","fiche produit","intermediaire",[36,37,38],"1.6","1.7","8.x","\u003Ch2>Pourquoi ajouter un champ personnalisé à vos produits\u003C\u002Fh2>\n\u003Cp>Le catalogue PrestaShop couvre la majorité des besoins e-commerce standard, mais certains secteurs exigent des informations spécifiques : date limite de consommation (DLC) pour l'alimentaire, numéro d'homologation pour l'automobile, indice de protection pour l'électronique, ou encore dosage pour la parapharmacie.\u003C\u002Fp>\n\u003Cp>Plutôt que de détourner un champ existant (comme la description courte), la bonne pratique consiste à \u003Cstrong>étendre proprement le modèle Product\u003C\u002Fstrong> via le système d'override et la couche ObjectModel de PrestaShop.\u003C\u002Fp>\n\u003Cp>Ce guide vous accompagne à travers les quatre étapes nécessaires : modification de la base de données, override de la classe \u003Ccode>Product\u003C\u002Fcode>, intégration au back-office, et affichage en front-office.\u003C\u002Fp>\n\u003Ch2>Étape 1 — Ajouter la colonne en base de données\u003C\u002Fh2>\n\u003Cp>Le champ doit d'abord exister physiquement dans la table correspondante. Pour un champ \u003Cstrong>multilingue\u003C\u002Fstrong> (traduisible), c'est la table \u003Ccode>ps_product_lang\u003C\u002Fcode> qui est concernée. Pour un champ non traduit, ce serait \u003Ccode>ps_product\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3>Champ multilingue (dans `ps_product_lang`)\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nALTER TABLE `ps_product_lang`\nADD COLUMN `product_dlc` TEXT DEFAULT NULL\nAFTER `description_short`;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Champ non multilingue (dans `ps_product`)\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nALTER TABLE `ps_product`\nADD COLUMN `product_dlc` VARCHAR(255) DEFAULT NULL\nAFTER `reference`;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\u003Cp>\u003Cstrong>Bonne pratique :\u003C\u002Fstrong> choisissez le type SQL adapté à votre donnée. Un \u003Ccode>TEXT\u003C\u002Fcode> convient pour du contenu riche (HTML autorisé), un \u003Ccode>VARCHAR(255)\u003C\u002Fcode> pour une valeur courte, un \u003Ccode>DATE\u003C\u002Fcode> pour une date stricte. Évitez le \u003Ccode>TEXT\u003C\u002Fcode> si un type plus restrictif suffit — cela améliore les performances d'indexation.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Cblockquote>\u003Cp>\u003Cstrong>Attention au préfixe :\u003C\u002Fstrong> remplacez \u003Ccode>ps_\u003C\u002Fcode> par le préfixe réel de votre installation si vous l'avez personnalisé.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>Étape 2 — Override de la classe Product\u003C\u002Fh2>\n\u003Cp>PrestaShop utilise le pattern \u003Cstrong>ObjectModel\u003C\u002Fstrong> : chaque propriété publique déclarée dans la définition du modèle est automatiquement mappée à la base de données. Il faut donc informer l'ORM de l'existence du nouveau champ.\u003C\u002Fp>\n\u003Cp>Créez le fichier \u003Ccode>override\u002Fclasses\u002FProduct.php\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n&lt;?php\n\u002F**\n * Override de la classe Product\n * Ajout du champ personnalisé product_dlc\n *\u002F\nclass Product extends ProductCore\n{\n    \u002F** @var string Champ personnalisé — ex : Date Limite de Consommation *\u002F\n    public $product_dlc;\n\n    public function __construct(\n        $id_product = null,\n        $full = false,\n        $id_lang = null,\n        $id_shop = null,\n        Context $context = null\n    ) {\n        \u002F\u002F Déclaration du champ AVANT l'appel au constructeur parent\n        self::$definition['fields']['product_dlc'] = [\n            'type'     =&gt; self::TYPE_HTML,\n            'lang'     =&gt; true,\n            'validate' =&gt; 'isCleanHtml',\n            'size'     =&gt; 65535,\n        ];\n\n        parent::__construct($id_product, $full, $id_lang, $id_shop, $context);\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Points techniques importants\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>**`self::$definition` vs `parent::$definition`** : les deux fonctionnent, mais `self::$definition` est plus explicite. La propriété `$definition` est statique et partagée.\u003C\u002Fli>\n\u003Cli>**`lang => true`** : indique à l'ORM que le champ est multilingue (stocké dans `ps_product_lang`). Si votre champ est dans `ps_product`, mettez `false`.\u003C\u002Fli>\n\u003Cli>**`validate => 'isCleanHtml'`** : plus sécurisé que `isString` car il filtre les balises dangereuses (XSS). Utilisez `isString` uniquement pour du texte brut sans HTML.\u003C\u002Fli>\n\u003Cli>**`type => self::TYPE_HTML`** : autorise le contenu HTML. Alternatives : `TYPE_STRING`, `TYPE_INT`, `TYPE_FLOAT`, `TYPE_DATE`, `TYPE_BOOL`.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Vider le cache des classes\u003C\u002Fh3>\n\u003Cp>Après avoir créé l'override, \u003Cstrong>supprimez impérativement\u003C\u002Fstrong> le fichier de cache :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">\nrm -f var\u002Fcache\u002Fprod\u002Fclass_index.php\nrm -f var\u002Fcache\u002Fdev\u002Fclass_index.php\n# PrestaShop 1.6 :\nrm -f cache\u002Fclass_index.php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Sans cette étape, PrestaShop continuera d'utiliser la classe originale et votre champ sera ignoré silencieusement.\u003C\u002Fp>\n\u003Ch2>Étape 3 — Intégrer le champ au back-office\u003C\u002Fh2>\n\u003Cp>L'approche diffère selon la version de PrestaShop.\u003C\u002Fp>\n\u003Ch3>PrestaShop 1.6 — Override du template admin\u003C\u002Fh3>\n\u003Cp>Dans PrestaShop 1.6, la fiche produit utilise des templates Smarty. Créez un override du template \u003Ccode>information.tpl\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-\">\noverride\u002Fcontrollers\u002Fadmin\u002Ftemplates\u002Fproducts\u002Finformation.tpl\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Copiez le contenu original depuis \u003Ccode>controllers\u002Fadmin\u002Ftemplates\u002Fproducts\u002Finformation.tpl\u003C\u002Fcode> et ajoutez votre champ dans le formulaire :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n&lt;div class=\"form-group\"&gt;\n    &lt;label class=\"control-label col-lg-3\"&gt;\n        {l s='DLC \u002F Date limite'}\n    &lt;\u002Flabel&gt;\n    &lt;div class=\"col-lg-9\"&gt;\n        {foreach from=$languages item=language}\n            &lt;div class=\"translatable-field lang-{$language.id_lang}\"\n                 {if $language.id_lang != $default_language}style=\"display:none\"{\u002Fif}&gt;\n                &lt;div class=\"col-lg-9\"&gt;\n                    &lt;textarea name=\"product_dlc_{$language.id_lang}\"\n                              class=\"autoload_rte\"\n                              id=\"product_dlc_{$language.id_lang}\"&gt;{$product-&gt;product_dlc[$language.id_lang]|escape:'html':'UTF-8'}&lt;\u002Ftextarea&gt;\n                &lt;\u002Fdiv&gt;\n                &lt;div class=\"col-lg-2\"&gt;\n                    &lt;button type=\"button\" class=\"btn btn-default dropdown-toggle\" data-toggle=\"dropdown\"&gt;\n                        {$language.iso_code} &lt;span class=\"caret\"&gt;&lt;\u002Fspan&gt;\n                    &lt;\u002Fbutton&gt;\n                    &lt;ul class=\"dropdown-menu\"&gt;\n                        {foreach from=$languages item=lang}\n                            &lt;li&gt;&lt;a href=\"javascript:hideOtherLanguage({$lang.id_lang});\"&gt;{$lang.name}&lt;\u002Fa&gt;&lt;\u002Fli&gt;\n                        {\u002Fforeach}\n                    &lt;\u002Ful&gt;\n                &lt;\u002Fdiv&gt;\n            &lt;\u002Fdiv&gt;\n        {\u002Fforeach}\n    &lt;\u002Fdiv&gt;\n&lt;\u002Fdiv&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>PrestaShop 1.7 \u002F 8.x — Hook et FormBuilder\u003C\u002Fh3>\n\u003Cp>À partir de la version 1.7, PrestaShop utilise Symfony et le système de hooks pour étendre le formulaire produit. La méthode recommandée est de créer un \u003Cstrong>module\u003C\u002Fstrong> qui se greffe sur les hooks appropriés :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F\u002F Dans votre module\npublic function hookActionProductFormBuilderModifier(array $params): void\n{\n    \u002F** @var \\Symfony\\Component\\Form\\FormBuilderInterface $formBuilder *\u002F\n    $formBuilder = $params['form_builder'];\n    $productId = (int) $params['id'];\n\n    $formBuilder-&gt;add('product_dlc', TranslateType::class, [\n        'label' =&gt; $this-&gt;trans('DLC \u002F Date limite', [], 'Modules.Votremodule.Admin'),\n        'type' =&gt; FormattedTextareaType::class,\n        'locales' =&gt; $this-&gt;get('prestashop.adapter.legacy.context')-&gt;getLanguages(),\n        'required' =&gt; false,\n    ]);\n\n    \u002F\u002F Pré-remplir avec les valeurs existantes\n    $product = new Product($productId);\n    $params['data']['product_dlc'] = $product-&gt;product_dlc;\n\n    $formBuilder-&gt;setData($params['data']);\n}\n\npublic function hookActionAfterUpdateProductFormHandler(array $params): void\n{\n    $productId = (int) $params['id'];\n    $formData = $params['form_data'];\n\n    $product = new Product($productId);\n    $product-&gt;product_dlc = $formData['product_dlc'] ?? [];\n    $product-&gt;save();\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\u003Cp>\u003Cstrong>PrestaShop 8.x\u003C\u002Fstrong> : la nouvelle page produit utilise des hooks différents. Vérifiez la documentation officielle pour \u003Ccode>actionProductFormBuilderModifier\u003C\u002Fcode> qui reste compatible, mais le rendu visuel peut nécessiter des ajustements.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>Étape 4 — Afficher le champ en front-office\u003C\u002Fh2>\n\u003Cp>Une fois le champ sauvegardé, il faut l'exposer dans le template de la fiche produit.\u003C\u002Fp>\n\u003Ch3>Rendre la variable disponible dans Smarty\u003C\u002Fh3>\n\u003Cp>Pour PrestaShop 1.6, le champ est automatiquement accessible via \u003Ccode>{$product->product_dlc}\u003C\u002Fcode> dans le template \u003Ccode>product.tpl\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Pour PrestaShop 1.7+, créez un override du \u003Ccode>ProductController\u003C\u002Fcode> ou utilisez le hook \u003Ccode>actionFrontControllerSetMedia\u003C\u002Fcode> pour ajouter la variable :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function hookActionFrontControllerSetMedia(array $params): void\n{\n    \u002F\u002F Le champ est déjà dans l'objet Product grâce à l'override de classe\n    \u002F\u002F Il sera accessible via {$product.product_dlc} dans les templates\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Ou plus directement, overridez \u003Ccode>ProductController::assignAttributesGroups()\u003C\u002Fcode> pour ajouter la variable au template.\u003C\u002Fp>\n\u003Ch3>Template Smarty (front-office)\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{* PrestaShop 1.6 *}\n{if isset($product-&gt;product_dlc) && $product-&gt;product_dlc}\n    &lt;div class=\"product-dlc\"&gt;\n        &lt;h3&gt;{l s='Informations complémentaires'}&lt;\u002Fh3&gt;\n        &lt;div class=\"dlc-content\"&gt;{$product-&gt;product_dlc}&lt;\u002Fdiv&gt;\n    &lt;\u002Fdiv&gt;\n{\u002Fif}\n\n{* PrestaShop 1.7 \u002F 8.x *}\n{if isset($product.product_dlc) && $product.product_dlc}\n    &lt;div class=\"product-dlc\"&gt;\n        &lt;h3&gt;{l s='Informations complémentaires' d='Shop.Theme.Catalog'}&lt;\u002Fh3&gt;\n        &lt;div class=\"dlc-content\"&gt;{$product.product_dlc nofilter}&lt;\u002Fdiv&gt;\n    &lt;\u002Fdiv&gt;\n{\u002Fif}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\u003Cp>\u003Cstrong>Sécurité :\u003C\u002Fstrong> le filtre \u003Ccode>nofilter\u003C\u002Fcode> est nécessaire pour le HTML, mais assurez-vous que la validation \u003Ccode>isCleanHtml\u003C\u002Fcode> est bien en place côté ObjectModel pour éviter les injections XSS.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>Erreurs fréquentes à éviter\u003C\u002Fh2>\n\u003Ch3>Confondre les formats de fichier\u003C\u002Fh3>\n\u003Cp>Attention à ne pas confondre les extensions et formats : \u003Ccode>.csv\u003C\u002Fcode> (fichier de données tabulaires), \u003Ccode>.css\u003C\u002Fcode> (feuille de style) et \u003Ccode>.tpl\u003C\u002Fcode> (template Smarty) ont des rôles très différents. Une erreur de nommage peut entraîner des heures de débogage inutile.\u003C\u002Fp>\n\u003Ch3>Oublier le cache des classes\u003C\u002Fh3>\n\u003Cp>C'est l'erreur numéro un. Votre override est parfait mais ne fonctionne pas ? Le fichier \u003Ccode>class_index.php\u003C\u002Fcode> n'a pas été régénéré. Supprimez-le systématiquement après chaque modification d'override.\u003C\u002Fp>\n\u003Ch3>Modifier le core au lieu d'utiliser les overrides\u003C\u002Fh3>\n\u003Cp>Ne modifiez \u003Cstrong>jamais\u003C\u002Fstrong> directement \u003Ccode>classes\u002FProduct.php\u003C\u002Fcode> ou les fichiers dans \u003Ccode>controllers\u002Fadmin\u002F\u003C\u002Fcode>. Chaque mise à jour de PrestaShop écraserait vos modifications. Les overrides (ou mieux, un module dédié) survivent aux mises à jour.\u003C\u002Fp>\n\u003Ch3>Ne pas sauvegarder avant de modifier la base\u003C\u002Fh3>\n\u003Cp>Avant tout \u003Ccode>ALTER TABLE\u003C\u002Fcode>, faites un dump :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">\nmysqldump -u root -p prestashop ps_product_lang &gt; backup_product_lang.sql\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Approche recommandée en 2024+ : le module dédié\u003C\u002Fh2>\n\u003Cp>Si les overrides fonctionnent, la \u003Cstrong>meilleure pratique\u003C\u002Fstrong> pour PrestaShop 1.7 et 8.x est d'encapsuler toute cette logique dans un module. Avantages :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>**Portabilité** : installation\u002Fdésinstallation propre via le back-office\u003C\u002Fli>\n\u003Cli>**Mise à jour** : les hooks sont plus pérennes que les overrides\u003C\u002Fli>\n\u003Cli>**Multi-champs** : un seul module peut gérer N champs personnalisés\u003C\u002Fli>\n\u003Cli>**Réversibilité** : la méthode `uninstall()` peut nettoyer la base\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Le module gère alors les quatre étapes (SQL, ObjectModel, formulaire BO, affichage FO) dans un package autonome et maintenable.\u003C\u002Fp>",[41,44,47,50,53],{"q":42,"a":43},"Comment ajouter un champ personnalisé à un produit PrestaShop sans modifier le core ?","La méthode recommandée combine trois actions : ajouter une colonne SQL dans ps_product_lang (champ multilingue) ou ps_product (champ simple), créer un override de la classe Product dans override\u002Fclasses\u002FProduct.php pour déclarer le champ dans la définition ObjectModel, puis intégrer le champ au formulaire back-office via un override de template (PS 1.6) ou un hook Symfony (PS 1.7\u002F8.x). Cette approche survit aux mises à jour de PrestaShop.",{"q":45,"a":46},"Pourquoi mon override de classe Product ne fonctionne pas dans PrestaShop ?","Dans 90 % des cas, le problème vient du cache des classes. PrestaShop maintient un fichier class_index.php qui référence l'emplacement de chaque classe. Après avoir créé ou modifié un override, supprimez ce fichier : rm var\u002Fcache\u002Fprod\u002Fclass_index.php (PS 1.7\u002F8.x) ou rm cache\u002Fclass_index.php (PS 1.6). PrestaShop le régénérera automatiquement au prochain chargement de page.",{"q":48,"a":49},"Quelle différence entre un champ dans ps_product et ps_product_lang ?","La table ps_product stocke les données communes à toutes les langues (référence, prix, poids, stock). La table ps_product_lang stocke les données traduisibles, avec une ligne par combinaison produit\u002Flangue. Si votre champ personnalisé doit être différent en français et en anglais (description, nom spécifique), utilisez ps_product_lang avec lang => true dans la définition ObjectModel. Sinon, utilisez ps_product avec lang => false.",{"q":51,"a":52},"Faut-il utiliser un override ou un module pour ajouter des champs produit dans PrestaShop 8 ?","Pour PrestaShop 8.x, le module est fortement recommandé. Les overrides restent fonctionnels mais sont considérés comme une approche legacy. Un module utilise les hooks Symfony (actionProductFormBuilderModifier, actionAfterUpdateProductFormHandler) pour s'intégrer proprement au formulaire produit, et gère son propre cycle de vie (installation, désinstallation, mise à jour). C'est plus maintenable, portable et compatible avec les futures versions.",{"q":54,"a":55},"Comment afficher un champ personnalisé dans le template Smarty de la fiche produit ?","En PrestaShop 1.6, utilisez {$product->product_dlc} directement dans product.tpl. En PrestaShop 1.7\u002F8.x, la syntaxe est {$product.product_dlc nofilter} (notation tableau). Le filtre nofilter est nécessaire si le champ contient du HTML, mais assurez-vous que la validation isCleanHtml est déclarée dans la définition ObjectModel pour prévenir les failles XSS. Encadrez toujours l'affichage d'une condition {if} pour éviter les blocs vides.","Pour ajouter un champ personnalisé aux produits PrestaShop, il faut intervenir à quatre niveaux : colonne SQL dans ps_product_lang, override de la classe Product (ObjectModel), intégration au formulaire back-office, et affichage front-office via Smarty. En PS 8.x, préférez un module avec hooks Symfony.",6,"2026-03-21T16:16:21.000Z",[],"PrestaShop pour les développeurs",{"columns":62},[63,79,109,130],{"title":64,"links":65},"Plateforme",[66,70,73,76],{"label":67,"href":68,"external":69},"Offre Starter (2 500 €)","\u002Foffre-starter",false,{"label":71,"href":72,"external":69},"Devenir Ambassadeur","\u002Fambassadeur",{"label":74,"href":75,"external":69},"Modules PrestaShop","\u002Fmodules",{"label":77,"href":78,"external":20},"CodeMyShop.com","https:\u002F\u002Fcodemyshop.com",{"title":80,"links":81},"Le Synedre",[82,85,88,91,94,97,100,103,106],{"label":83,"href":84,"external":69},"L'histoire","\u002Fsynedre",{"label":86,"href":87,"external":69},"Constitution","\u002Fsynedre\u002Fconstitution",{"label":89,"href":90,"external":69},"L'équipe","\u002Fequipe",{"label":92,"href":93,"external":69},"Le réacteur en direct","\u002Freacteur",{"label":95,"href":96,"external":69},"Le Drill (entraînement)","\u002Fdrill",{"label":98,"href":99,"external":69},"Protocole de réunion","\u002Fsynedre\u002Freunion",{"label":101,"href":102,"external":69},"Les agents IA","\u002Fagents-ia",{"label":104,"href":105,"external":69},"La Conduite","\u002Fsynedre\u002Fconduite",{"label":107,"href":108,"external":69},"Charte plateforme","\u002Fsynedre\u002Fcharte",{"title":110,"links":111},"Ressources",[112,115,118,121,124,127],{"label":113,"href":114,"external":69},"Blog","\u002Fblog",{"label":116,"href":117,"external":69},"Academy","\u002Facademy",{"label":119,"href":120,"external":69},"Dictionnaire","\u002Fdictionnaire",{"label":122,"href":123,"external":69},"Expertise PrestaShop","\u002Fexpertise",{"label":125,"href":126,"external":69},"Flywheel","\u002Fflywheel",{"label":128,"href":129,"external":69},"Manifeste","\u002Fmanifeste",{"title":131,"links":132},"À propos",[133,136,139],{"label":134,"href":135,"external":69},"Alexandre Carette","\u002Fa-propos",{"label":137,"href":138,"external":69},"Dossier de presse","\u002Fpresse",{"label":140,"href":141,"external":69},"Contact","\u002Fcontact",{"items":143},[144,153,159,165,173,181,187,192],{"id":145,"type":146,"label":147,"href":123,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":150,"children":151,"psChildren":152},41,"link",{"fr":148},"Expertise",null,0,[],[],{"id":154,"type":146,"label":155,"href":114,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":156,"children":157,"psChildren":158},42,{"fr":113},1,[],[],{"id":160,"type":146,"label":161,"href":75,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":162,"children":163,"psChildren":164},43,{"fr":74},2,[],[],{"id":166,"type":146,"label":167,"href":169,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":170,"children":171,"psChildren":172},44,{"fr":168},"Outils IA","\u002Foutils-ia",3,[],[],{"id":174,"type":146,"label":175,"href":68,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":177,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":178,"children":179,"psChildren":180},45,{"fr":176},"Offre Starter ✨",{"highlight":20},4,[],[],{"id":182,"type":146,"label":183,"href":117,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":184,"children":185,"psChildren":186},46,{"fr":116},5,[],[],{"id":188,"type":146,"label":189,"href":135,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":57,"children":190,"psChildren":191},47,{"fr":131},[],[],{"id":193,"type":146,"label":194,"href":141,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":195,"children":196,"psChildren":197},48,{"fr":140},7,[],[],{"academy":199,"blog":200,"expertise":211},[],[201,205,208],{"title":202,"url":203,"score":156,"type":204},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back","blog",{"title":206,"url":207,"score":156,"type":204},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":209,"url":210,"score":156,"type":204},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[],{"footer":213},{"theme":214,"description":149,"hours":149,"logo":215,"contact":218,"social":219,"bottomBar":229},"dark",{"src":216,"href":217,"alt":134},"\u002Flogo-ac.svg","\u002F",{"email":149,"phone":149,"address":149,"cta":149},[220,223,226],{"platform":221,"href":222,"label":221},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":224,"href":225,"label":224},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":227,"href":228,"label":227},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":149},{"header":231},{"logo":232,"topBar":235,"contactEmail":238,"features":239,"navBar":149},{"src":216,"alt":233,"text":134,"href":217,"class":234},"Alexandre Carette — Architecte E-commerce Souverain","h-10 w-10",{"message":149,"showLanguages":69,"align":236,"languages":237},"left",[],"contact@alexandrecarette.fr",{"showSearch":69,"showWishlist":69,"showLogin":20,"showContact":69,"showCart":69,"stickyHeader":20,"headerLayout":240},"inline"]