[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fBaBojHv6xnGPlMC1CyU4LfbTnXRF5UZstktxz7yiI8Y":22,"megamenu":61,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":130,"header-db":198,"footer-db":211,"$fTuhK128IfQMfGDtZDCg8xdO0ze6hzqWF2_QdglW2Fu0":227},{"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},"Passer une variable Smarty dans jQuery sur PrestaShop","passer-variable-smarty-dans-jquery-prestashop","Comment récupérer une variable Smarty dans un script jQuery sur PrestaShop : attributs data, balise literal, boucles foreach et appels AJAX.","developpement",[28,29,30,31,32,33],"smarty","jquery","javascript","ajax","templates","data-attributes","intermediaire",[36,37,38],"1.6","1.7","8.x","\u003Ch2>Le problème : Smarty et JavaScript ne parlent pas le même langage\u003C\u002Fh2>\n\u003Cp>Quand on développe un module ou un thème PrestaShop, on se retrouve tôt ou tard face à ce mur : comment récupérer une variable Smarty (côté serveur) dans un script jQuery (côté client) ?\u003C\u002Fp>\n\u003Cp>La tentation naturelle est d'écrire quelque chose comme :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-javascript\">\nvar idmsg = $(\".test\").val();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Mais \u003Ccode>.val()\u003C\u002Fcode> ne fonctionne que sur les éléments de formulaire (\u003Ccode>input\u003C\u002Fcode>, \u003Ccode>select\u003C\u002Fcode>, \u003Ccode>textarea\u003C\u002Fcode>). Sur un \u003Ccode>\u003Cp>\u003C\u002Fcode> ou un \u003Ccode>\u003Cdiv>\u003C\u002Fcode>, il renvoie \u003Ccode>undefined\u003C\u002Fcode>. Et même en utilisant \u003Ccode>.text()\u003C\u002Fcode> ou \u003Ccode>.html()\u003C\u002Fcode>, le vrai piège arrive quand on travaille dans une boucle \u003Ccode>{foreach}\u003C\u002Fcode> : le sélecteur de classe cible \u003Cstrong>tous\u003C\u002Fstrong> les éléments portant cette classe, et jQuery ne récupère que la valeur du \u003Cstrong>premier\u003C\u002Fstrong> (ou du dernier, selon la méthode).\u003C\u002Fp>\n\u003Cp>Voici la bonne approche, propre et maintenable.\u003C\u002Fp>\n\u003Ch2>Solution : les attributs HTML5 `data-*` combinés à `{literal}`\u003C\u002Fh2>\n\u003Cp>La technique repose sur deux mécanismes complémentaires :\u003C\u002Fp>\n\u003Col>\n\u003Cli>**Les attributs `data-*`** du HTML5 pour injecter la valeur Smarty dans le DOM\u003C\u002Fli>\n\u003Cli>**La balise `{literal}`** de Smarty pour empêcher l'interprétation des accolades jQuery comme du Smarty\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Pourquoi `{literal}` est indispensable\u003C\u002Fh3>\n\u003Cp>Smarty utilise les accolades \u003Ccode>{}\u003C\u002Fcode> comme délimiteurs. Or jQuery et JavaScript en font un usage intensif (objets, fonctions, callbacks). Sans \u003Ccode>{literal}\u003C\u002Fcode>, Smarty tente d'interpréter chaque \u003Ccode>{\u003C\u002Fcode> de votre code JavaScript et provoque des erreurs de compilation du template.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{literal}\n&lt;script type=\"text\u002Fjavascript\"&gt;\n\u002F\u002F Ici, les accolades sont protégées de Smarty\njQuery(document).ready(function() {\n    \u002F\u002F Votre code JS en toute sécurité\n});\n&lt;\u002Fscript&gt;\n{\u002Fliteral}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\u003Cp>\u003Cstrong>PrestaShop 1.7+ et 8.x :\u003C\u002Fstrong> Si vous utilisez les fichiers \u003Ccode>.js\u003C\u002Fcode> séparés (bonne pratique), le problème \u003Ccode>{literal}\u003C\u002Fcode> ne se pose plus puisque Smarty ne traite pas les fichiers JavaScript externes. Privilégiez cette approche dans vos modules modernes.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch3>Le template : injecter les données dans le DOM\u003C\u002Fh3>\n\u003Cp>Dans votre fichier \u003Ccode>.tpl\u003C\u002Fcode>, utilisez les attributs \u003Ccode>data-*\u003C\u002Fcode> pour attacher chaque valeur Smarty à son élément HTML :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{foreach from=$messages item=message name=messageLoop}\n&lt;div class=\"message-item\" data-id=\"{$message.id_msg|intval}\"&gt;\n    &lt;div class=\"message-content\"&gt;\n        {$message.content|escape:'html':'UTF-8'}\n    &lt;\u002Fdiv&gt;\n    &lt;button class=\"btn-mark-read\" data-id=\"{$message.id_msg|intval}\"&gt;\n        Marquer comme lu\n    &lt;\u002Fbutton&gt;\n&lt;\u002Fdiv&gt;\n{\u002Fforeach}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Points importants :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>**`|intval`** sur les identifiants numériques pour se prémunir contre les injections XSS\u003C\u002Fli>\n\u003Cli>**`|escape:'html':'UTF-8'`** sur tout contenu textuel affiché\u003C\u002Fli>\n\u003Cli>L'attribut `data-id` est **unique à chaque itération** du `foreach`, contrairement à une classe CSS qui serait partagée par tous les éléments\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Le JavaScript : récupérer la bonne valeur au clic\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{literal}\n&lt;script type=\"text\u002Fjavascript\"&gt;\njQuery(document).ready(function($) {\n    $('.btn-mark-read').on('click', function(e) {\n        e.preventDefault();\n\n        \u002F\u002F $(this) cible le bouton cliqué, pas tous les boutons\n        var idMsg = $(this).attr('data-id');\n        \u002F\u002F Ou en syntaxe moderne : $(this).data('id');\n\n        $.ajax({\n            url: '{\u002Fliteral}{$module_dir}{literal}ajax\u002Fmark-read.php',\n            type: 'POST',\n            data: {\n                id_msg: idMsg,\n                token: '{\u002Fliteral}{$token}{literal}'\n            },\n            dataType: 'json',\n            success: function(response) {\n                if (response.success) {\n                    \u002F\u002F Retirer visuellement le message ou changer son style\n                    $(e.target).closest('.message-item').addClass('read');\n                }\n            },\n            error: function(xhr, status, error) {\n                console.error('Erreur AJAX:', error);\n            }\n        });\n    });\n});\n&lt;\u002Fscript&gt;\n{\u002Fliteral}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Le secret est dans \u003Ccode>$(this)\u003C\u002Fcode> : à l'intérieur du gestionnaire d'événement \u003Ccode>click\u003C\u002Fcode>, \u003Ccode>this\u003C\u002Fcode> référence \u003Cstrong>l'élément précis qui a été cliqué\u003C\u002Fstrong>, pas l'ensemble des éléments correspondant au sélecteur. C'est ce qui résout le problème du \u003Ccode>foreach\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Ch2>Pourquoi `.val()` et `.text()` échouent dans une boucle\u003C\u002Fh2>\n\u003Cp>Pour bien comprendre le piège, détaillons ce qui se passe avec les approches naïves :\u003C\u002Fp>\n\u003Ctr>\u003Cth>Méthode\u003C\u002Fth>\u003Cth>Comportement dans un foreach\u003C\u002Fth>\u003Cth>Résultat\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`$('.test').val()`\u003C\u002Fth>\u003Cth>Cible le premier élément `.test`, renvoie `undefined` sur un `\u003Cp>`\u003C\u002Fth>\u003Cth>Échec total\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`$('.test').text()`\u003C\u002Fth>\u003Cth>Cible le premier élément `.test` uniquement\u003C\u002Fth>\u003Cth>Toujours la même valeur\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`$('.test').each()`\u003C\u002Fth>\u003Cth>Parcourt tous les éléments mais sans contexte de clic\u003C\u002Fth>\u003Cth>Pas de lien avec l'interaction utilisateur\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`$(this).data('id')`\u003C\u002Fth>\u003Cth>Cible l'élément cliqué précisément\u003C\u002Fth>\u003Cth>Valeur correcte à chaque clic\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ch2>Approche moderne : PrestaShop 1.7+ et 8.x\u003C\u002Fh2>\n\u003Cp>Sur les versions modernes de PrestaShop, la bonne pratique est de séparer complètement le JavaScript du template Smarty.\u003C\u002Fp>\n\u003Ch3>1. Enregistrer le script dans votre module\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function hookDisplayHeader()\n{\n    \u002F\u002F Passer les données PHP → JS via Media::addJsDef\n    Media::addJsDef([\n        'myModuleAjaxUrl' =&gt; $this-&gt;context-&gt;link-&gt;getModuleLink(\n            $this-&gt;name,\n            'ajax',\n            [],\n            true\n        ),\n        'myModuleToken' =&gt; Tools::getToken(false)\n    ]);\n\n    $this-&gt;context-&gt;controller-&gt;addJS(\n        $this-&gt;_path . 'views\u002Fjs\u002Ffront.js'\n    );\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>2. Le fichier JavaScript externe\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-javascript\">\n\u002F\u002F views\u002Fjs\u002Ffront.js\n\u002F\u002F Pas besoin de {literal} puisque Smarty ne traite pas ce fichier\n\njQuery(document).ready(function($) {\n    $(document).on('click', '.btn-mark-read', function(e) {\n        e.preventDefault();\n        var idMsg = $(this).data('id');\n\n        $.ajax({\n            url: myModuleAjaxUrl,\n            type: 'POST',\n            data: {\n                action: 'markAsRead',\n                id_msg: idMsg,\n                token: myModuleToken\n            },\n            dataType: 'json',\n            success: function(response) {\n                if (response.success) {\n                    $(e.target).closest('.message-item')\n                        .fadeOut(300, function() {\n                            $(this).addClass('read').fadeIn(300);\n                        });\n                }\n            }\n        });\n    });\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>3. Le contrôleur AJAX côté module\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F\u002F controllers\u002Ffront\u002Fajax.php\nclass MyModuleAjaxModuleFrontController extends ModuleFrontController\n{\n    public function initContent()\n    {\n        if (!Tools::getIsset('token')\n            || Tools::getValue('token') !== Tools::getToken(false)) {\n            die(json_encode(['success' =&gt; false, 'error' =&gt; 'Invalid token']));\n        }\n\n        $action = Tools::getValue('action');\n\n        if ($action === 'markAsRead') {\n            $idMsg = (int) Tools::getValue('id_msg');\n            \u002F\u002F Votre logique métier ici\n            $result = Db::getInstance()-&gt;update(\n                'my_messages',\n                ['is_read' =&gt; 1],\n                'id_msg = ' . $idMsg\n            );\n            die(json_encode(['success' =&gt; (bool) $result]));\n        }\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Cette architecture est plus propre, plus sécurisée (token CSRF, contrôleur dédié) et plus facile à déboguer.\u003C\u002Fp>\n\u003Ch2>Les erreurs classiques à éviter\u003C\u002Fh2>\n\u003Ch3>1. Oublier d'échapper les variables Smarty\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-smarty\">\n{* DANGEREUX — injection XSS possible *}\n&lt;div data-name=\"{$message.name}\"&gt;\n\n{* CORRECT *}\n&lt;div data-name=\"{$message.name|escape:'html':'UTF-8'}\"&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>2. Construire la query string manuellement\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-javascript\">\n\u002F\u002F FRAGILE — pas d'encodage, pas de structure\nvar dataString = '&idmsg=' + idmsg;\n\n\u002F\u002F CORRECT — jQuery encode automatiquement\n$.ajax({\n    data: { id_msg: idmsg }\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>3. Ne pas valider côté serveur\u003C\u002Fh3>\n\u003Cp>Même si la valeur vient d'un attribut \u003Ccode>data-*\u003C\u002Fcode> que vous avez généré, validez \u003Cstrong>toujours\u003C\u002Fstrong> côté PHP :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n$idMsg = (int) Tools::getValue('id_msg');\nif ($idMsg &lt;= 0) {\n    die(json_encode(['success' =&gt; false, 'error' =&gt; 'ID invalide']));\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>4. Utiliser `.click()` au lieu de `.on('click')`\u003C\u002Fh3>\n\u003Cp>Si vos éléments sont générés dynamiquement (AJAX, pagination), \u003Ccode>.click()\u003C\u002Fcode> ne fonctionnera pas sur les nouveaux éléments. Utilisez la délégation d'événements :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-javascript\">\n\u002F\u002F Ne fonctionne PAS sur les éléments ajoutés après le chargement\n$('.btn-mark-read').click(function() { ... });\n\n\u002F\u002F Fonctionne TOUJOURS grâce à la délégation\n$(document).on('click', '.btn-mark-read', function() { ... });\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Récapitulatif\u003C\u002Fh2>\n\u003Ctr>\u003Cth>Contexte\u003C\u002Fth>\u003Cth>Technique recommandée\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>PrestaShop 1.6 avec JS inline\u003C\u002Fth>\u003Cth>`{literal}` + attributs `data-*` + `$(this)`\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>PrestaShop 1.7 \u002F 8.x\u003C\u002Fth>\u003Cth>`Media::addJsDef()` + fichier JS externe + contrôleur AJAX\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Boucle foreach\u003C\u002Fth>\u003Cth>Toujours `$(this).data('key')`, jamais sélecteur de classe global\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Sécurité\u003C\u002Fth>\u003Cth>Token CSRF + `intval` + `escape` + validation serveur\u003C\u002Fth>\u003C\u002Ftr>",[41,44,47,50,53],{"q":42,"a":43},"Pourquoi mon script jQuery ne récupère que la dernière valeur du foreach Smarty ?","C'est le piège le plus courant. Si vous utilisez un sélecteur de classe comme `$('.test').text()`, jQuery cible le premier élément trouvé (ou le dernier si vous écrasez une variable dans une boucle). La solution est d'utiliser des attributs `data-*` sur chaque élément du foreach, puis `$(this).data('key')` dans le gestionnaire d'événement pour cibler précisément l'élément avec lequel l'utilisateur interagit.",{"q":45,"a":46},"Faut-il toujours utiliser {literal} dans les templates Smarty pour le JavaScript ?","Uniquement si votre code JavaScript est écrit directement dans le fichier `.tpl`. La balise `{literal}` empêche Smarty d'interpréter les accolades comme des délimiteurs de template. La meilleure pratique sur PrestaShop 1.7 et 8.x est de placer le JavaScript dans un fichier `.js` externe chargé via `$this->context->controller->addJS()` et de passer les variables PHP avec `Media::addJsDef()`. Ainsi, `{literal}` devient inutile.",{"q":48,"a":49},"Comment passer plusieurs variables Smarty à un appel AJAX dans PrestaShop ?","Placez chaque variable dans un attribut `data-*` distinct sur l'élément HTML : `data-id=\"{$item.id|intval}\"`, `data-name=\"{$item.name|escape:'html':'UTF-8'}\"`. Côté JavaScript, récupérez-les avec `$(this).data('id')` et `$(this).data('name')`, puis passez-les dans l'objet `data` de `$.ajax()` sous forme de paires clé-valeur. jQuery se chargera de l'encodage URL automatiquement.",{"q":51,"a":52},"Quelle est la différence entre .val(), .text(), .html() et .data() en jQuery ?","`.val()` récupère la valeur d'un champ de formulaire (input, select, textarea) — il renvoie `undefined` sur un div ou un paragraphe. `.text()` récupère le contenu textuel visible d'un élément. `.html()` récupère le contenu HTML interne. `.data('key')` lit un attribut `data-key` du DOM (avec mise en cache par jQuery). Pour transmettre des identifiants ou des paramètres depuis Smarty vers jQuery, `.data()` est la méthode la plus propre et la plus fiable.",{"q":54,"a":55},"Comment sécuriser un appel AJAX dans un module PrestaShop ?","Trois mesures essentielles : 1) Utilisez un token CSRF généré par `Tools::getToken(false)` côté PHP et vérifié à chaque requête AJAX. 2) Passez par un contrôleur front dédié (`ModuleFrontController`) plutôt qu'un fichier PHP isolé accessible directement. 3) Validez systématiquement les données reçues côté serveur avec `(int)`, `pSQL()` ou les méthodes de validation de PrestaShop. Ne faites jamais confiance aux données envoyées par le client, même si elles proviennent d'attributs que vous avez générés.","Pour récupérer une variable Smarty dans jQuery au sein d'une boucle foreach, utilisez les attributs HTML5 data-* pour injecter les valeurs dans le DOM, la balise {literal} pour protéger le JavaScript inline, et $(this).data('key') pour cibler l'élément précis cliqué par l'utilisateur.",6,"2026-03-21T13:54:02.000Z",[],"PrestaShop pour les développeurs",{"items":62},[63,74,82,90,98,107,115,122],{"id":64,"type":65,"label":66,"href":68,"icon":69,"description":69,"badge":69,"groupTitle":69,"style":69,"gridColumns":69,"cssClass":69,"psCategoryId":69,"showPsChildren":70,"position":71,"children":72,"psChildren":73},41,"link",{"fr":67},"Expertise","\u002Fexpertise",null,false,0,[],[],{"id":75,"type":65,"label":76,"href":78,"icon":69,"description":69,"badge":69,"groupTitle":69,"style":69,"gridColumns":69,"cssClass":69,"psCategoryId":69,"showPsChildren":70,"position":79,"children":80,"psChildren":81},42,{"fr":77},"Blog","\u002Fblog",1,[],[],{"id":83,"type":65,"label":84,"href":86,"icon":69,"description":69,"badge":69,"groupTitle":69,"style":69,"gridColumns":69,"cssClass":69,"psCategoryId":69,"showPsChildren":70,"position":87,"children":88,"psChildren":89},43,{"fr":85},"Modules PrestaShop","\u002Fmodules",2,[],[],{"id":91,"type":65,"label":92,"href":94,"icon":69,"description":69,"badge":69,"groupTitle":69,"style":69,"gridColumns":69,"cssClass":69,"psCategoryId":69,"showPsChildren":70,"position":95,"children":96,"psChildren":97},44,{"fr":93},"Outils IA","\u002Foutils-ia",3,[],[],{"id":99,"type":65,"label":100,"href":102,"icon":69,"description":69,"badge":69,"groupTitle":69,"style":103,"gridColumns":69,"cssClass":69,"psCategoryId":69,"showPsChildren":70,"position":104,"children":105,"psChildren":106},45,{"fr":101},"Offre Starter ✨","\u002Foffre-starter",{"highlight":20},4,[],[],{"id":108,"type":65,"label":109,"href":111,"icon":69,"description":69,"badge":69,"groupTitle":69,"style":69,"gridColumns":69,"cssClass":69,"psCategoryId":69,"showPsChildren":70,"position":112,"children":113,"psChildren":114},46,{"fr":110},"Academy","\u002Facademy",5,[],[],{"id":116,"type":65,"label":117,"href":119,"icon":69,"description":69,"badge":69,"groupTitle":69,"style":69,"gridColumns":69,"cssClass":69,"psCategoryId":69,"showPsChildren":70,"position":57,"children":120,"psChildren":121},47,{"fr":118},"À propos","\u002Fa-propos",[],[],{"id":123,"type":65,"label":124,"href":126,"icon":69,"description":69,"badge":69,"groupTitle":69,"style":69,"gridColumns":69,"cssClass":69,"psCategoryId":69,"showPsChildren":70,"position":127,"children":128,"psChildren":129},48,{"fr":125},"Contact","\u002Fcontact",7,[],[],{"columns":131},[132,144,174,190],{"title":133,"links":134},"Plateforme",[135,137,140,141],{"label":136,"href":102,"external":70},"Offre Starter (2 500 €)",{"label":138,"href":139,"external":70},"Devenir Ambassadeur","\u002Fambassadeur",{"label":85,"href":86,"external":70},{"label":142,"href":143,"external":20},"CodeMyShop.com","https:\u002F\u002Fcodemyshop.com",{"title":145,"links":146},"Le Synedre",[147,150,153,156,159,162,165,168,171],{"label":148,"href":149,"external":70},"L'histoire","\u002Fsynedre",{"label":151,"href":152,"external":70},"Constitution","\u002Fsynedre\u002Fconstitution",{"label":154,"href":155,"external":70},"L'équipe","\u002Fequipe",{"label":157,"href":158,"external":70},"Le réacteur en direct","\u002Freacteur",{"label":160,"href":161,"external":70},"Le Drill (entraînement)","\u002Fdrill",{"label":163,"href":164,"external":70},"Protocole de réunion","\u002Fsynedre\u002Freunion",{"label":166,"href":167,"external":70},"Les agents IA","\u002Fagents-ia",{"label":169,"href":170,"external":70},"La Conduite","\u002Fsynedre\u002Fconduite",{"label":172,"href":173,"external":70},"Charte plateforme","\u002Fsynedre\u002Fcharte",{"title":175,"links":176},"Ressources",[177,178,179,182,184,187],{"label":77,"href":78,"external":70},{"label":110,"href":111,"external":70},{"label":180,"href":181,"external":70},"Dictionnaire","\u002Fdictionnaire",{"label":183,"href":68,"external":70},"Expertise PrestaShop",{"label":185,"href":186,"external":70},"Flywheel","\u002Fflywheel",{"label":188,"href":189,"external":70},"Manifeste","\u002Fmanifeste",{"title":118,"links":191},[192,194,197],{"label":193,"href":119,"external":70},"Alexandre Carette",{"label":195,"href":196,"external":70},"Dossier de presse","\u002Fpresse",{"label":125,"href":126,"external":70},{"header":199},{"logo":200,"topBar":205,"contactEmail":208,"features":209,"navBar":69},{"src":201,"alt":202,"text":193,"href":203,"class":204},"\u002Flogo-ac.svg","Alexandre Carette — Architecte E-commerce Souverain","\u002F","h-10 w-10",{"message":69,"showLanguages":70,"align":206,"languages":207},"left",[],"contact@alexandrecarette.fr",{"showSearch":70,"showWishlist":70,"showLogin":20,"showContact":70,"showCart":70,"stickyHeader":20,"headerLayout":210},"inline",{"footer":212},{"theme":213,"description":69,"hours":69,"logo":214,"contact":215,"social":216,"bottomBar":226},"dark",{"src":201,"href":203,"alt":193},{"email":69,"phone":69,"address":69,"cta":69},[217,220,223],{"platform":218,"href":219,"label":218},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":221,"href":222,"label":221},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":224,"href":225,"label":224},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":69},{"academy":228,"blog":229,"expertise":240},[],[230,234,237],{"title":231,"url":232,"score":79,"type":233},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back","blog",{"title":235,"url":236,"score":79,"type":233},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":238,"url":239,"score":79,"type":233},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[]]