[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fX8hVLUx-xHN3UyKl7UoAO18VIb2EEgk3E-WWm3iR53Y":22,"megamenu":59,"$fPaiVsE8-pLl_81lEnpciitkkYDiPsk6nllsPI2aP2C8":128,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":142,"header-db":210,"footer-db":223},{"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},"Ajouter un champ personnalisé produit dans PrestaShop (back office et front)","ajouter-champ-personnalise-produit-prestashop","Guide complet pour créer un custom field produit dans PrestaShop 1.7 et 8.x : base de données, classe Product, formulaire admin et affichage front.","developpement",[28,29,30,31,32],"custom field","override","Product.php","back office","champ personnalisé","intermediaire",[35,36],"1.7","8.x","\u003Ch2>Introduction\u003C\u002Fh2>\n\u003Cp>Ajouter un champ personnalisé à la fiche produit PrestaShop est l'un des besoins les plus fréquents en développement e-commerce. Que ce soit pour stocker une référence fournisseur spécifique, un argumentaire technique ou une donnée métier propre à votre catalogue, la mécanique reste la même : intervenir sur la base de données, la classe \u003Ccode>Product\u003C\u002Fcode>, le formulaire back office et l'affichage front office.\u003C\u002Fp>\n\u003Cp>Ce guide couvre la méthode complète, testée de PrestaShop 1.7 à 8.x, avec les bonnes pratiques pour chaque version.\u003C\u002Fp>\n\u003Ch2>Étape 1 : Ajouter la colonne en base de données\u003C\u002Fh2>\n\u003Cp>Le champ personnalisé doit être multilingue dans la majorité des cas (descriptions, argumentaires, labels). On l'ajoute donc dans la table \u003Ccode>ps_product_lang\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nALTER TABLE `ps_product_lang`\nADD COLUMN `custom_field` TEXT DEFAULT NULL\nAFTER `available_later`;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\u003Cp>\u003Cstrong>Bonne pratique :\u003C\u002Fstrong> Si votre champ n'a pas besoin de traduction (un code EAN fournisseur, par exemple), ajoutez-le plutôt dans \u003Ccode>ps_product\u003C\u002Fcode> directement. Réservez \u003Ccode>ps_product_lang\u003C\u002Fcode> aux données qui varient selon la langue.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch3>Pourquoi TEXT et pas VARCHAR ?\u003C\u002Fh3>\n\u003Cp>Utilisez \u003Ccode>TEXT\u003C\u002Fcode> si le contenu peut dépasser 255 caractères (descriptions techniques, HTML). Pour un simple label court, un \u003Ccode>VARCHAR(255)\u003C\u002Fcode> sera plus performant en indexation.\u003C\u002Fp>\n\u003Ch2>Étape 2 : Déclarer le champ dans la classe Product\u003C\u002Fh2>\n\u003Cp>PrestaShop utilise un ORM maison basé sur \u003Ccode>ObjectModel\u003C\u002Fcode>. Pour que votre champ soit reconnu, deux modifications sont nécessaires dans la classe \u003Ccode>Product\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch3>Déclarer la propriété\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F\u002F classes\u002FProduct.php (ou override)\npublic $custom_field;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Ajouter la définition dans `$definition`\u003C\u002Fh3>\n\u003Cp>Dans le tableau \u003Ccode>$definition['fields']\u003C\u002Fcode>, section des champs multilingues :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n'custom_field' =&gt; [\n    'type' =&gt; self::TYPE_HTML,\n    'lang' =&gt; true,\n    'validate' =&gt; 'isCleanHtml',\n    'size' =&gt; 65535,\n],\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\u003Cp>\u003Cstrong>Note importante sur les types de validation :\u003C\u002Fstrong>\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Cblockquote>\u003Cp>- \u003Ccode>self::TYPE_STRING\u003C\u002Fcode> + \u003Ccode>isGenericName\u003C\u002Fcode> : texte court sans HTML\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Cblockquote>\u003Cp>- \u003Ccode>self::TYPE_HTML\u003C\u002Fcode> + \u003Ccode>isCleanHtml\u003C\u002Fcode> : contenu riche avec HTML autorisé\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Cblockquote>\u003Cp>- \u003Ccode>self::TYPE_STRING\u003C\u002Fcode> + \u003Ccode>isReference\u003C\u002Fcode> : codes alphanumériques stricts\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Cp>>\u003C\u002Fp>\n\u003Cblockquote>\u003Cp>Choisissez le type de validation adapté à votre usage. Un champ qui accepte du HTML mal validé est un vecteur XSS.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>Étape 3 : Override vs modification directe\u003C\u002Fh2>\n\u003Ch3>PrestaShop 1.7 : le système d'override classique\u003C\u002Fh3>\n\u003Cp>Sur PrestaShop 1.7, le mécanisme d'override de classes fonctionne en plaçant un fichier dans \u003Ccode>override\u002Fclasses\u002FProduct.php\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n&lt;?php\n\nclass Product extends ProductCore\n{\n    public $custom_field;\n\n    public function __construct($id_product = null, $full = false, $id_lang = null, $id_shop = null, Context $context = null)\n    {\n        \u002F\u002F Injecter la définition avant le constructeur parent\n        self::$definition['fields']['custom_field'] = [\n            'type' =&gt; self::TYPE_HTML,\n            'lang' =&gt; true,\n            'validate' =&gt; 'isCleanHtml',\n        ];\n\n        parent::__construct($id_product, $full, $id_lang, $id_shop, $context);\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Après création de l'override, \u003Cstrong>supprimez le fichier cache\u003C\u002Fstrong> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">\nrm var\u002Fcache\u002Fprod\u002Fclass_index.php\nrm var\u002Fcache\u002Fdev\u002Fclass_index.php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>PrestaShop 8.x : privilégiez un module\u003C\u002Fh3>\n\u003Cp>Depuis PrestaShop 8, la recommandation officielle est de \u003Cstrong>ne plus utiliser les overrides\u003C\u002Fstrong> pour les classes core. Préférez un module qui utilise les hooks Symfony :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F\u002F modules\u002Fmymodule\u002Fmymodule.php\npublic function install()\n{\n    return parent::install()\n        && $this-&gt;registerHook('actionProductFormBuilderModifier')\n        && $this-&gt;registerHook('actionAfterUpdateProductFormHandler')\n        && $this-&gt;registerHook('actionAfterCreateProductFormHandler')\n        && $this-&gt;installSql();\n}\n\nprivate function installSql()\n{\n    $sql = 'ALTER TABLE `' . _DB_PREFIX_ . 'product_lang`\n            ADD COLUMN IF NOT EXISTS `custom_field` TEXT DEFAULT NULL';\n    return Db::getInstance()-&gt;execute($sql);\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Pour le formulaire back office sous Symfony (PS 8.x), utilisez le hook \u003Ccode>actionProductFormBuilderModifier\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function hookActionProductFormBuilderModifier(array $params)\n{\n    $formBuilder = $params['form_builder'];\n    $productId = $params['id'];\n\n    $formBuilder-&gt;add('custom_field', TextareaType::class, [\n        'label' =&gt; $this-&gt;l('Mon champ personnalisé'),\n        'required' =&gt; false,\n        'attr' =&gt; ['rows' =&gt; 5],\n    ]);\n\n    \u002F\u002F Pré-remplir avec la valeur existante\n    $params['data']['custom_field'] = $this-&gt;getCustomFieldValue($productId);\n    $formBuilder-&gt;setData($params['data']);\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Étape 4 : Afficher le champ dans les requêtes SQL du catalogue\u003C\u002Fh2>\n\u003Cp>Un piège classique : vous ajoutez le champ en base et dans la classe, mais il n'apparaît pas en front. C'est parce que les requêtes SQL de PrestaShop sélectionnent explicitement les colonnes.\u003C\u002Fp>\n\u003Cp>Dans la classe \u003Ccode>Category\u003C\u002Fcode>, la méthode \u003Ccode>getProducts()\u003C\u002Fcode> contient une requête SQL qui liste les champs de \u003Ccode>ps_product_lang\u003C\u002Fcode>. Il faut y ajouter votre champ :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\n-- Extrait de la requête Category::getProducts()\nSELECT p.*, product_shop.*, ...\n    pl.`description`, pl.`description_short`,\n    pl.`available_now`, pl.`available_later`,\n    pl.`link_rewrite`, pl.`meta_description`,\n    pl.`meta_keywords`, pl.`meta_title`,\n    pl.`name`, pl.`custom_field`,  -- Ajout ici\n    image_shop.`id_image` id_image, ...\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Cette même logique s'applique à d'autres méthodes qui construisent des requêtes manuelles : \u003Ccode>Product::getProductsProperties()\u003C\u002Fcode>, \u003Ccode>Search::find()\u003C\u002Fcode>, etc.\u003C\u002Fp>\n\u003Cblockquote>\u003Cp>\u003Cstrong>Attention :\u003C\u002Fstrong> En PrestaShop 8.x avec Doctrine, certaines de ces requêtes sont gérées différemment. Vérifiez si un \u003Ccode>Repository\u003C\u002Fcode> Doctrine n'a pas remplacé la requête SQL brute.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>Étape 5 : Afficher le champ en front office\u003C\u002Fh2>\n\u003Cp>Dans votre template Smarty (PS 1.7) ou Twig (PS 8.x module), le champ est accessible via l'objet produit.\u003C\u002Fp>\n\u003Ch3>Template Smarty (thème classique)\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{* templates\u002Fcatalog\u002Fproduct.tpl *}\n{if $product.custom_field}\n    &lt;div class=\"product-custom-field\"&gt;\n        &lt;h3&gt;Information complémentaire&lt;\u002Fh3&gt;\n        &lt;div&gt;{$product.custom_field nofilter}&lt;\u002Fdiv&gt;\n    &lt;\u002Fdiv&gt;\n{\u002Fif}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Assignation Smarty dans un controller\u003C\u002Fh3>\n\u003Cp>Si le champ n'est pas automatiquement disponible dans le template, vous pouvez l'assigner via un override du \u003Ccode>ProductController\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function initContent()\n{\n    parent::initContent();\n\n    $product = $this-&gt;context-&gt;controller-&gt;getTemplateVarProduct();\n    \u002F\u002F Le champ est normalement déjà dans $product si la classe est bien configurée\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Il n'est généralement \u003Cstrong>pas nécessaire\u003C\u002Fstrong> d'assigner manuellement une variable à Smarty si le champ est correctement déclaré dans \u003Ccode>$definition\u003C\u002Fcode> avec \u003Ccode>lang => true\u003C\u002Fcode>. L'ORM de PrestaShop le charge automatiquement.\u003C\u002Fp>\n\u003Ch2>Étape 6 : Formulaire back office (PrestaShop 1.7 legacy)\u003C\u002Fh2>\n\u003Cp>Sur PrestaShop 1.7 avec le formulaire legacy (AdminProductsController), le formulaire produit est rendu par \u003Ccode>renderForm()\u003C\u002Fcode>. L'approche la plus propre est d'utiliser un hook dans un module :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function hookDisplayAdminProductsMainStepLeftColumnMiddle($params)\n{\n    $productId = (int) $params['id_product'];\n    $languages = Language::getLanguages(true);\n    $product = new Product($productId);\n\n    $this-&gt;context-&gt;smarty-&gt;assign([\n        'custom_field' =&gt; $product-&gt;custom_field,\n        'languages' =&gt; $languages,\n        'default_language' =&gt; Configuration::get('PS_LANG_DEFAULT'),\n    ]);\n\n    return $this-&gt;display(__FILE__, 'views\u002Ftemplates\u002Fhook\u002Fcustom_field.tpl');\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Récapitulatif des fichiers modifiés\u003C\u002Fh2>\n\u003Ctr>\u003Cth>Fichier\u003C\u002Fth>\u003Cth>Modification\u003C\u002Fth>\u003Cth>Méthode\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Base de données\u003C\u002Fth>\u003Cth>`ALTER TABLE ps_product_lang`\u003C\u002Fth>\u003Cth>SQL direct ou module `install()`\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`classes\u002FProduct.php`\u003C\u002Fth>\u003Cth>Propriété + `$definition`\u003C\u002Fth>\u003Cth>Override (1.7) ou module (8.x)\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`classes\u002FCategory.php`\u003C\u002Fth>\u003Cth>Requête SQL `getProducts()`\u003C\u002Fth>\u003Cth>Override si nécessaire\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Template front\u003C\u002Fth>\u003Cth>Affichage conditionnel\u003C\u002Fth>\u003Cth>`product.tpl` ou hook module\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Formulaire admin\u003C\u002Fth>\u003Cth>Champ dans le formulaire\u003C\u002Fth>\u003Cth>Hook module\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ch2>Erreurs fréquentes à éviter\u003C\u002Fh2>\n\u003Col>\n\u003Cli>**Oublier de vider le cache** après un override → le champ semble ne pas exister\u003C\u002Fli>\n\u003Cli>**Ne pas déclarer `lang => true`** alors que la colonne est dans `_lang` → erreur SQL silencieuse\u003C\u002Fli>\n\u003Cli>**Modifier le core directement** au lieu d'un override → perdu à la prochaine mise à jour\u003C\u002Fli>\n\u003Cli>**Oublier les requêtes SQL manuelles** dans `Category.php`, `Search.php`, etc. → le champ est vide en listing\u003C\u002Fli>\n\u003Cli>**Ne pas utiliser `nofilter` dans Smarty** pour un champ HTML → le contenu est échappé et le HTML s'affiche en texte brut\u003C\u002Fli>\n\u003C\u002Ful>",[39,42,45,48,51],{"q":40,"a":41},"Comment ajouter un champ personnalisé produit dans PrestaShop 8 sans override ?","Dans PrestaShop 8, utilisez un module avec les hooks Symfony : `actionProductFormBuilderModifier` pour ajouter le champ au formulaire, et `actionAfterUpdateProductFormHandler` pour sauvegarder la valeur. Créez la colonne en base via la méthode `install()` du module. Cette approche est pérenne et survivra aux mises à jour.",{"q":43,"a":44},"Pourquoi mon champ personnalisé apparaît dans le back office mais pas en front office ?","PrestaShop utilise des requêtes SQL explicites dans plusieurs classes (Category, Search, etc.) qui listent les colonnes une par une. Si votre champ n'est pas dans ces SELECT, il ne sera pas chargé en front. Vérifiez notamment `Category::getProducts()` et `Product::getProductsProperties()`. Ajoutez votre colonne dans chaque requête concernée via un override ou un module.",{"q":46,"a":47},"Faut-il ajouter le champ dans ps_product ou ps_product_lang ?","Si le champ doit être traduit dans plusieurs langues (description, label, argumentaire), ajoutez-le dans `ps_product_lang` avec `'lang' => true` dans la définition. Si c'est une donnée technique non traduisible (code fournisseur, référence interne), ajoutez-le dans `ps_product` avec `'lang' => false`.",{"q":49,"a":50},"Le champ personnalisé disparaît après une mise à jour PrestaShop, comment l'éviter ?","Ne modifiez jamais les fichiers core directement. Utilisez le système d'override (dossier `override\u002Fclasses\u002F`) sur PrestaShop 1.7, ou un module dédié sur PrestaShop 8.x. La colonne en base de données, elle, persiste après mise à jour. Seul le code PHP risque d'être écrasé si vous avez touché au core.",{"q":52,"a":53},"Comment rendre un champ personnalisé obligatoire dans le formulaire produit ?","Dans la définition `$definition`, ajoutez `'required' => true` au champ. PrestaShop validera automatiquement sa présence lors de la sauvegarde. Sur PS 8.x avec Symfony, ajoutez la contrainte `NotBlank` dans les options du FormBuilder : `'constraints' => [new NotBlank()]`.","Pour ajouter un champ personnalisé produit dans PrestaShop, il faut intervenir à 4 niveaux : colonne SQL dans ps_product_lang, déclaration dans la classe Product ($definition), ajout dans les requêtes SQL du catalogue (Category::getProducts), et affichage dans les templates. Sur PS 8.x, privilégiez un module avec les hooks Symfony plutôt qu'un override.",6,"2026-03-21T13:10:31.000Z",[],"PrestaShop pour les développeurs",{"items":60},[61,72,80,88,96,105,113,120],{"id":62,"type":63,"label":64,"href":66,"icon":67,"description":67,"badge":67,"groupTitle":67,"style":67,"gridColumns":67,"cssClass":67,"psCategoryId":67,"showPsChildren":68,"position":69,"children":70,"psChildren":71},41,"link",{"fr":65},"Expertise","\u002Fexpertise",null,false,0,[],[],{"id":73,"type":63,"label":74,"href":76,"icon":67,"description":67,"badge":67,"groupTitle":67,"style":67,"gridColumns":67,"cssClass":67,"psCategoryId":67,"showPsChildren":68,"position":77,"children":78,"psChildren":79},42,{"fr":75},"Blog","\u002Fblog",1,[],[],{"id":81,"type":63,"label":82,"href":84,"icon":67,"description":67,"badge":67,"groupTitle":67,"style":67,"gridColumns":67,"cssClass":67,"psCategoryId":67,"showPsChildren":68,"position":85,"children":86,"psChildren":87},43,{"fr":83},"Modules PrestaShop","\u002Fmodules",2,[],[],{"id":89,"type":63,"label":90,"href":92,"icon":67,"description":67,"badge":67,"groupTitle":67,"style":67,"gridColumns":67,"cssClass":67,"psCategoryId":67,"showPsChildren":68,"position":93,"children":94,"psChildren":95},44,{"fr":91},"Outils IA","\u002Foutils-ia",3,[],[],{"id":97,"type":63,"label":98,"href":100,"icon":67,"description":67,"badge":67,"groupTitle":67,"style":101,"gridColumns":67,"cssClass":67,"psCategoryId":67,"showPsChildren":68,"position":102,"children":103,"psChildren":104},45,{"fr":99},"Offre Starter ✨","\u002Foffre-starter",{"highlight":20},4,[],[],{"id":106,"type":63,"label":107,"href":109,"icon":67,"description":67,"badge":67,"groupTitle":67,"style":67,"gridColumns":67,"cssClass":67,"psCategoryId":67,"showPsChildren":68,"position":110,"children":111,"psChildren":112},46,{"fr":108},"Academy","\u002Facademy",5,[],[],{"id":114,"type":63,"label":115,"href":117,"icon":67,"description":67,"badge":67,"groupTitle":67,"style":67,"gridColumns":67,"cssClass":67,"psCategoryId":67,"showPsChildren":68,"position":55,"children":118,"psChildren":119},47,{"fr":116},"À propos","\u002Fa-propos",[],[],{"id":121,"type":63,"label":122,"href":124,"icon":67,"description":67,"badge":67,"groupTitle":67,"style":67,"gridColumns":67,"cssClass":67,"psCategoryId":67,"showPsChildren":68,"position":125,"children":126,"psChildren":127},48,{"fr":123},"Contact","\u002Fcontact",7,[],[],{"academy":129,"blog":130,"expertise":141},[],[131,135,138],{"title":132,"url":133,"score":77,"type":134},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back","blog",{"title":136,"url":137,"score":77,"type":134},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":139,"url":140,"score":77,"type":134},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[],{"columns":143},[144,156,186,202],{"title":145,"links":146},"Plateforme",[147,149,152,153],{"label":148,"href":100,"external":68},"Offre Starter (2 500 €)",{"label":150,"href":151,"external":68},"Devenir Ambassadeur","\u002Fambassadeur",{"label":83,"href":84,"external":68},{"label":154,"href":155,"external":20},"CodeMyShop.com","https:\u002F\u002Fcodemyshop.com",{"title":157,"links":158},"Le Synedre",[159,162,165,168,171,174,177,180,183],{"label":160,"href":161,"external":68},"L'histoire","\u002Fsynedre",{"label":163,"href":164,"external":68},"Constitution","\u002Fsynedre\u002Fconstitution",{"label":166,"href":167,"external":68},"L'équipe","\u002Fequipe",{"label":169,"href":170,"external":68},"Le réacteur en direct","\u002Freacteur",{"label":172,"href":173,"external":68},"Le Drill (entraînement)","\u002Fdrill",{"label":175,"href":176,"external":68},"Protocole de réunion","\u002Fsynedre\u002Freunion",{"label":178,"href":179,"external":68},"Les agents IA","\u002Fagents-ia",{"label":181,"href":182,"external":68},"La Conduite","\u002Fsynedre\u002Fconduite",{"label":184,"href":185,"external":68},"Charte plateforme","\u002Fsynedre\u002Fcharte",{"title":187,"links":188},"Ressources",[189,190,191,194,196,199],{"label":75,"href":76,"external":68},{"label":108,"href":109,"external":68},{"label":192,"href":193,"external":68},"Dictionnaire","\u002Fdictionnaire",{"label":195,"href":66,"external":68},"Expertise PrestaShop",{"label":197,"href":198,"external":68},"Flywheel","\u002Fflywheel",{"label":200,"href":201,"external":68},"Manifeste","\u002Fmanifeste",{"title":116,"links":203},[204,206,209],{"label":205,"href":117,"external":68},"Alexandre Carette",{"label":207,"href":208,"external":68},"Dossier de presse","\u002Fpresse",{"label":123,"href":124,"external":68},{"header":211},{"logo":212,"topBar":217,"contactEmail":220,"features":221,"navBar":67},{"src":213,"alt":214,"text":205,"href":215,"class":216},"\u002Flogo-ac.svg","Alexandre Carette — Architecte E-commerce Souverain","\u002F","h-10 w-10",{"message":67,"showLanguages":68,"align":218,"languages":219},"left",[],"contact@alexandrecarette.fr",{"showSearch":68,"showWishlist":68,"showLogin":20,"showContact":68,"showCart":68,"stickyHeader":20,"headerLayout":222},"inline",{"footer":224},{"theme":225,"description":67,"hours":67,"logo":226,"contact":227,"social":228,"bottomBar":238},"dark",{"src":213,"href":215,"alt":205},{"email":67,"phone":67,"address":67,"cta":67},[229,232,235],{"platform":230,"href":231,"label":230},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":233,"href":234,"label":233},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":236,"href":237,"label":236},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":67}]