[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fHlI4iY0efyNbLoRm0u5s9mc-LZccHUqP97T2_G3idd4":22,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":60,"megamenu":141,"$fR2sSl9k76E1c1cu0nFxqyCG4E8i2j8RcEZHiYBESsqo":197,"header-db":211,"footer-db":224},{"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":38,"faq":39,"tldr":55,"readingTime":56,"generatedAt":57,"publishDate":57,"relatedArticles":58,"sourceCategory":59},"Corriger l'erreur « id_shop n'est pas valide » en multi-boutique PrestaShop","erreur-multi-boutique-id-shop-invalide-prestashop","Guide complet pour résoudre l'erreur id_shop invalide en multi-boutique PrestaShop. Diagnostic, création des tables _shop manquantes et correction du modèle ObjectModel.","multiboutique",[28,29,30,31,32,33],"multi-boutique","id_shop","ObjectModel","module","debug","base de données","intermediaire",[36,37],"1.7","8.x","\u003Ch2>Le problème : un module incompatible multi-boutique\u003C\u002Fh2>\n\u003Cp>Vous activez le mode multi-boutique de PrestaShop, vous basculez sur un contexte boutique spécifique, et là : \u003Cstrong>« id_shop n'est pas valide »\u003C\u002Fstrong>. L'erreur survient systématiquement lorsqu'un module tiers tente d'enregistrer ou de lire des données sans gérer correctement l'association aux boutiques.\u003C\u002Fp>\n\u003Cp>Le coupable est presque toujours le même : le développeur du module n'a pas prévu la compatibilité multi-boutique dans sa structure de base de données ni dans son modèle \u003Ccode>ObjectModel\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2>Comprendre l'architecture multi-boutique de PrestaShop\u003C\u002Fh2>\n\u003Cp>PrestaShop repose sur un mécanisme de tables associatives pour isoler les données par boutique. Pour chaque entité compatible multi-boutique, on retrouve généralement trois tables :\u003C\u002Fp>\n\u003Ctr>\u003Cth>Table\u003C\u002Fth>\u003Cth>Rôle\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`ps_mon_entite`\u003C\u002Fth>\u003Cth>Table principale (données communes)\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`ps_mon_entite_shop`\u003C\u002Fth>\u003Cth>Association entité ↔ boutique\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`ps_mon_entite_lang`\u003C\u002Fth>\u003Cth>Traductions par langue (et parfois par boutique)\u003C\u002Fth>\u003C\u002Ftr>\n\u003Cp>Quand la table \u003Ccode>_shop\u003C\u002Fcode> est absente, PrestaShop ne peut pas associer l'enregistrement à une boutique. L'\u003Ccode>ObjectModel\u003C\u002Fcode> lève alors l'erreur \u003Ccode>id_shop n'est pas valide\u003C\u002Fcode> lors de l'appel à \u003Ccode>add()\u003C\u002Fcode> ou \u003Ccode>save()\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2>Diagnostic étape par étape\u003C\u002Fh2>\n\u003Ch3>1. Identifier les tables du module\u003C\u002Fh3>\n\u003Cp>Ouvrez phpMyAdmin et listez les tables du module concerné :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nSHOW TABLES LIKE '%navcmsblock%';\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Vous devriez obtenir quelque chose comme :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-\">\nps_tmnavcmsblockinfo\nps_tmnavcmsblockinfo_lang\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Si vous ne voyez \u003Cstrong>pas\u003C\u002Fstrong> de table \u003Ccode>ps_tmnavcmsblockinfo_shop\u003C\u002Fcode>, c'est la cause du problème.\u003C\u002Fp>\n\u003Ch3>2. Vérifier la colonne id_shop dans la table principale\u003C\u002Fh3>\n\u003Cp>Inspectez la structure de la table principale :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nDESCRIBE ps_tmnavcmsblockinfo;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Si la colonne \u003Ccode>id_shop\u003C\u002Fcode> est absente ou mal typée, l'\u003Ccode>ObjectModel\u003C\u002Fcode> ne peut pas filtrer par boutique.\u003C\u002Fp>\n\u003Ch3>3. Vérifier le modèle ObjectModel du module\u003C\u002Fh3>\n\u003Cp>Ouvrez le fichier PHP de la classe du modèle (souvent \u003Ccode>classes\u002FNavCmsBlock.php\u003C\u002Fcode> ou équivalent) et cherchez la propriété \u003Ccode>$definition\u003C\u002Fcode>. Un modèle correctement configuré pour le multi-boutique doit contenir :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic static $definition = array(\n    'table' =&gt; 'tmnavcmsblockinfo',\n    'primary' =&gt; 'id_tmnavcmsblockinfo',\n    'multilang' =&gt; true,\n    'multishop' =&gt; true,  \u002F\u002F &lt;-- Souvent absent dans les modules mal codés\n    'fields' =&gt; array(\n        'id_shop' =&gt; array('type' =&gt; self::TYPE_INT, 'validate' =&gt; 'isUnsignedId'),\n        \u002F\u002F ... autres champs\n    ),\n);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>L'absence de \u003Ccode>'multishop' => true\u003C\u002Fcode> ou de la déclaration du champ \u003Ccode>id_shop\u003C\u002Fcode> est un indicateur fiable du problème.\u003C\u002Fp>\n\u003Ch2>Correction complète\u003C\u002Fh2>\n\u003Ch3>Étape 1 : Créer la table `_shop` manquante\u003C\u002Fh3>\n\u003Cp>Exécutez cette requête SQL via phpMyAdmin (onglet SQL) :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nCREATE TABLE IF NOT EXISTS `ps_tmnavcmsblockinfo_shop` (\n    `id_tmnavcmsblockinfo` INT UNSIGNED NOT NULL,\n    `id_shop` INT(10) UNSIGNED NOT NULL,\n    PRIMARY KEY (`id_tmnavcmsblockinfo`, `id_shop`)\n) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\u003Cp>\u003Cstrong>Note PrestaShop 8.x :\u003C\u002Fstrong> Utilisez \u003Ccode>utf8mb4\u003C\u002Fcode> au lieu de \u003Ccode>utf8\u003C\u002Fcode> et \u003Ccode>InnoDB\u003C\u002Fcode> au lieu de la variable \u003Ccode>_MYSQL_ENGINE_\u003C\u002Fcode> si vous exécutez la requête manuellement. En PHP, conservez \u003Ccode>_MYSQL_ENGINE_\u003C\u002Fcode> pour la portabilité.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch3>Étape 2 : Ajouter id_shop dans la table _lang si nécessaire\u003C\u002Fh3>\n\u003Cp>Certains modules nécessitent aussi l'association boutique dans la table des traductions :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nALTER TABLE `ps_tmnavcmsblockinfo_lang`\nADD COLUMN `id_shop` INT(10) UNSIGNED NOT NULL DEFAULT 1\nAFTER `id_tmnavcmsblockinfo`;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Étape 3 : Peupler les associations existantes\u003C\u002Fh3>\n\u003Cp>Si des données existent déjà en base, associez-les à votre boutique par défaut :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nINSERT INTO `ps_tmnavcmsblockinfo_shop` (`id_tmnavcmsblockinfo`, `id_shop`)\nSELECT `id_tmnavcmsblockinfo`, 1\nFROM `ps_tmnavcmsblockinfo`\nWHERE `id_tmnavcmsblockinfo` NOT IN (\n    SELECT `id_tmnavcmsblockinfo` FROM `ps_tmnavcmsblockinfo_shop`\n);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Étape 4 : Corriger le modèle ObjectModel\u003C\u002Fh3>\n\u003Cp>Modifiez la classe PHP du modèle pour déclarer la compatibilité multi-boutique :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\nclass NavCmsBlock extends ObjectModel\n{\n    public $id_tmnavcmsblockinfo;\n    public $id_shop;\n    \u002F\u002F ... autres propriétés\n\n    public static $definition = array(\n        'table' =&gt; 'tmnavcmsblockinfo',\n        'primary' =&gt; 'id_tmnavcmsblockinfo',\n        'multilang' =&gt; true,\n        'multishop' =&gt; true,\n        'fields' =&gt; array(\n            'id_shop' =&gt; array(\n                'type' =&gt; self::TYPE_INT,\n                'validate' =&gt; 'isUnsignedId',\n                'shop' =&gt; true,\n            ),\n            \u002F\u002F ... autres champs existants\n        ),\n    );\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Étape 5 : Corriger la méthode installDB() du module\u003C\u002Fh3>\n\u003Cp>Pour que le module crée correctement ses tables lors d'une future installation, modifiez la méthode \u003Ccode>installDB()\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function installDB()\n{\n    $return = true;\n\n    \u002F\u002F Table principale\n    $return &= Db::getInstance()-&gt;execute('\n        CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'tmnavcmsblockinfo` (\n            `id_tmnavcmsblockinfo` INT UNSIGNED NOT NULL AUTO_INCREMENT,\n            `id_shop` INT(10) UNSIGNED DEFAULT NULL,\n            PRIMARY KEY (`id_tmnavcmsblockinfo`)\n        ) ENGINE=' . _MYSQL_ENGINE_ . ' DEFAULT CHARSET=utf8mb4;\n    ');\n\n    \u002F\u002F Table multi-boutique\n    $return &= Db::getInstance()-&gt;execute('\n        CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'tmnavcmsblockinfo_shop` (\n            `id_tmnavcmsblockinfo` INT UNSIGNED NOT NULL,\n            `id_shop` INT(10) UNSIGNED NOT NULL,\n            PRIMARY KEY (`id_tmnavcmsblockinfo`, `id_shop`)\n        ) ENGINE=' . _MYSQL_ENGINE_ . ' DEFAULT CHARSET=utf8mb4;\n    ');\n\n    \u002F\u002F Table traductions\n    $return &= Db::getInstance()-&gt;execute('\n        CREATE TABLE IF NOT EXISTS `' . _DB_PREFIX_ . 'tmnavcmsblockinfo_lang` (\n            `id_tmnavcmsblockinfo` INT UNSIGNED NOT NULL,\n            `id_shop` INT(10) UNSIGNED NOT NULL DEFAULT 1,\n            `id_lang` INT(10) UNSIGNED NOT NULL,\n            `title` VARCHAR(255) DEFAULT NULL,\n            `content` TEXT DEFAULT NULL,\n            PRIMARY KEY (`id_tmnavcmsblockinfo`, `id_shop`, `id_lang`)\n        ) ENGINE=' . _MYSQL_ENGINE_ . ' DEFAULT CHARSET=utf8mb4;\n    ');\n\n    return $return;\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Le piège du typage : id_shop en string\u003C\u002Fh2>\n\u003Cp>Un problème subtil mais fréquent : PrestaShop peut retourner \u003Ccode>id_shop\u003C\u002Fcode> sous forme de \u003Cstrong>string\u003C\u002Fstrong> au lieu d'un entier. Si le module effectue une comparaison stricte (\u003Ccode>===\u003C\u002Fcode>), la validation échoue silencieusement.\u003C\u002Fp>\n\u003Cp>Le diagnostic :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n$id_shop = (int) Shop::getContextShopID();\n\u002F\u002F ou\n$id_shop = (int) Context::getContext()-&gt;shop-&gt;id;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Castez \u003Cstrong>toujours\u003C\u002Fstrong> \u003Ccode>id_shop\u003C\u002Fcode> en \u003Ccode>int\u003C\u002Fcode> avant de l'utiliser dans vos requêtes ou comparaisons.\u003C\u002Fp>\n\u003Ch2>Vérification rapide avec Shop::getShops()\u003C\u002Fh2>\n\u003Cp>Pour confirmer que PrestaShop détecte bien vos boutiques, utilisez ce snippet de debug temporaire :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n$shops = Shop::getShops();\nerror_log(print_r($shops, true));\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Vous devriez obtenir un tableau associatif contenant au minimum une entrée avec \u003Ccode>id_shop\u003C\u002Fcode>, \u003Ccode>name\u003C\u002Fcode>, et \u003Ccode>active\u003C\u002Fcode>. Si ce tableau est vide, le problème est plus profond : vérifiez la table \u003Ccode>ps_shop\u003C\u002Fcode> et la configuration multi-boutique dans les paramètres généraux.\u003C\u002Fp>\n\u003Ch2>Bonnes pratiques pour les développeurs de modules\u003C\u002Fh2>\n\u003Ch3>Checklist multi-boutique\u003C\u002Fh3>\n\u003Col>\n\u003Cli>**Table `_shop` obligatoire** pour toute entité ObjectModel\u003C\u002Fli>\n\u003Cli>**Propriété `multishop => true`** dans `$definition`\u003C\u002Fli>\n\u003Cli>**Colonne `id_shop`** dans la table principale ET la table `_lang` si applicable\u003C\u002Fli>\n\u003Cli>**Clé primaire composite** `(id_entite, id_shop)` dans la table `_shop`\u003C\u002Fli>\n\u003Cli>**Cast en int** systématique de `id_shop` dans les requêtes\u003C\u002Fli>\n\u003Cli>**Hook `actionShopDataDuplication`** pour dupliquer les données lors de la création d'une nouvelle boutique\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>PrestaShop 8.x : ce qui change\u003C\u002Fh3>\n\u003Cp>Depuis PrestaShop 8, le \u003Ccode>ObjectModel\u003C\u002Fcode> valide plus strictement les associations multi-boutique. Un module qui fonctionnait \"par chance\" en 1.6 ou 1.7 sans table \u003Ccode>_shop\u003C\u002Fcode> échouera quasi-systématiquement en 8.x. Si vous migrez, auditez toutes les classes \u003Ccode>ObjectModel\u003C\u002Fcode> de vos modules tiers avec :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">\ngrep -rn \"multishop\" modules\u002Ftm_*\u002Fclasses\u002F\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Tout module sans \u003Ccode>multishop => true\u003C\u002Fcode> dans ses définitions est un candidat au bug.\u003C\u002Fp>",[40,43,46,49,52],{"q":41,"a":42},"Pourquoi l'erreur « id_shop n'est pas valide » apparaît uniquement en contexte multi-boutique ?","En mode mono-boutique, PrestaShop n'exige pas de table _shop ni de colonne id_shop explicite : il utilise implicitement l'id_shop 1. Dès que le multi-boutique est activé, l'ObjectModel vérifie systématiquement l'association entre chaque enregistrement et la boutique courante. Si la table _shop est absente ou si id_shop n'est pas correctement déclaré dans la définition du modèle, la validation échoue avec cette erreur.",{"q":44,"a":45},"Comment rendre un module PrestaShop existant compatible multi-boutique ?","Trois actions sont nécessaires : (1) créer une table associative _shop avec une clé primaire composite (id_entite, id_shop), (2) ajouter 'multishop' => true dans la propriété $definition de chaque ObjectModel du module, (3) s'assurer que les méthodes add(), save() et delete() du modèle propagent correctement l'id_shop. Pensez aussi à ajouter id_shop dans la table _lang si le module gère des traductions par boutique.",{"q":47,"a":48},"Faut-il modifier la table _lang pour le multi-boutique PrestaShop ?","Oui, dans la plupart des cas. Si votre module doit permettre des traductions différentes par boutique (ce qui est courant pour les blocs CMS, descriptions, etc.), la table _lang doit contenir une colonne id_shop et la clé primaire doit devenir (id_entite, id_shop, id_lang). Sans cela, toutes les boutiques partageront les mêmes traductions, ce qui peut être voulu ou non selon le cas d'usage.",{"q":50,"a":51},"L'erreur id_shop peut-elle venir d'un problème de typage PHP ?","Absolument. PrestaShop retourne parfois id_shop sous forme de chaîne de caractères (string) au lieu d'un entier. Si le code du module effectue une comparaison stricte avec === ou si la validation du champ attend un entier, la vérification échoue. La solution est de toujours caster id_shop en int avec (int)Shop::getContextShopID() avant toute utilisation.",{"q":53,"a":54},"Comment diagnostiquer rapidement si un module est compatible multi-boutique ?","Recherchez 'multishop' dans les fichiers de classes du module avec grep -rn \"multishop\" modules\u002Fnom_module\u002Fclasses\u002F. Vérifiez aussi en base de données si une table _shop existe pour chaque table principale du module avec SHOW TABLES LIKE '%nom_module%'. L'absence de l'un ou l'autre est un indicateur fiable d'incompatibilité.","L'erreur « id_shop n'est pas valide » survient quand un module PrestaShop ne possède pas de table _shop associative ni la déclaration multishop dans son ObjectModel. La correction implique de créer la table manquante, d'ajouter id_shop dans les tables existantes, et de mettre à jour la définition du modèle PHP.",6,"2026-03-21T12:59:40.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,186,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":183,"children":184,"psChildren":185},46,{"fr":115},5,[],[],{"id":187,"type":145,"label":188,"href":134,"icon":148,"description":148,"badge":148,"groupTitle":148,"style":148,"gridColumns":148,"cssClass":148,"psCategoryId":148,"showPsChildren":68,"position":56,"children":189,"psChildren":190},47,{"fr":130},[],[],{"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},"Docker PrestaShop Headless : architecture multi-conteneurs en prod","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fdocker-headless-multi-conteneurs","blog",{"title":205,"url":206,"score":155,"type":203},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back",{"title":208,"url":209,"score":155,"type":203},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",[],{"header":212},{"logo":213,"topBar":218,"contactEmail":221,"features":222,"navBar":148},{"src":214,"alt":215,"text":133,"href":216,"class":217},"\u002Flogo-ac.svg","Alexandre Carette — Architecte E-commerce Souverain","\u002F","h-10 w-10",{"message":148,"showLanguages":68,"align":219,"languages":220},"left",[],"contact@alexandrecarette.fr",{"showSearch":68,"showWishlist":68,"showLogin":20,"showContact":68,"showCart":68,"stickyHeader":20,"headerLayout":223},"inline",{"footer":225},{"theme":226,"description":148,"hours":148,"logo":227,"contact":228,"social":229,"bottomBar":239},"dark",{"src":214,"href":216,"alt":133},{"email":148,"phone":148,"address":148,"cta":148},[230,233,236],{"platform":231,"href":232,"label":231},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":234,"href":235,"label":234},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":237,"href":238,"label":237},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":148}]