[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fulefRsBX2zRzmziY9FCs8mKc9_Esg8eM5qUWReyW17U":22,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":59,"$f_6cDaPzYkNNlRsP1bMSbqUQjKBXOkUHRYwMUsbrQ8ws":140,"megamenu":156,"footer-db":210,"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},"Générer un PDF dans un module PrestaShop : guide complet","generer-pdf-module-prestashop-guide-complet","Découvrez comment générer des PDF personnalisés dans un module PrestaShop : contrôleur dédié, classe PDF, erreurs AJAX courantes et bonnes pratiques.","developpement",[28,29,30,31,32],"pdf","module prestashop","tcpdf","génération documents","controleur admin","intermediaire",[35,36],"1.7","8.x","\u003Ch1>Générer un PDF dans un module PrestaShop : guide complet\u003C\u002Fh1>\n\u003Cp>La génération de documents PDF — factures personnalisées, bons de livraison, attestations ou tout autre document métier — est un besoin récurrent dans l'écosystème PrestaShop. Pourtant, de nombreux développeurs se heurtent à des PDF qui ne se génèrent tout simplement pas, souvent à cause d'un mauvais choix d'architecture pour déclencher la génération.\u003C\u002Fp>\n\u003Cp>Cet article détaille les bonnes pratiques pour créer un système de génération PDF fiable dans un module PrestaShop, en évitant les pièges classiques liés à AJAX et aux en-têtes HTTP.\u003C\u002Fp>\n\u003Ch2>Pourquoi la génération PDF échoue souvent via AJAX\u003C\u002Fh2>\n\u003Cp>L'erreur la plus fréquente consiste à vouloir générer un PDF via une requête AJAX. Le problème est fondamental : un PDF est un fichier binaire que le navigateur doit recevoir avec les bons en-têtes HTTP (\u003Ccode>Content-Type: application\u002Fpdf\u003C\u002Fcode>, \u003Ccode>Content-Disposition\u003C\u002Fcode>) pour déclencher le téléchargement ou l'affichage.\u003C\u002Fp>\n\u003Cp>Or, une requête AJAX intercepte la réponse en JavaScript. Le navigateur ne sait pas qu'il doit ouvrir un fichier — il reçoit du binaire brut dans un callback JS, ce qui produit :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Un fichier corrompu si on tente de le reconstruire côté client\u003C\u002Fli>\n\u003Cli>Une page blanche si la réponse n'est pas traitée\u003C\u002Fli>\n\u003Cli>Des erreurs `json_decode` si le contrôleur attend du JSON mais reçoit du binaire\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>La solution : une requête HTTP classique\u003C\u002Fh3>\n\u003Cp>Pour générer un PDF, il suffit de passer par une URL directe ou un formulaire HTML classique. Le navigateur reçoit alors les en-têtes corrects et propose le téléchargement nativement.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F\u002F ❌ Mauvaise approche : AJAX\n$.ajax({\n    url: baseUrl + 'module\u002Fmonmodule\u002Fgeneratepdf',\n    data: { id_order: orderId },\n    success: function(response) {\n        \u002F\u002F Le PDF binaire arrive ici... inutilisable\n    }\n});\n\n\u002F\u002F ✅ Bonne approche : redirection directe\nwindow.location.href = baseUrl + 'module\u002Fmonmodule\u002Fgeneratepdf?id_order=' + orderId;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Créer un contrôleur dédié à la génération PDF\u003C\u002Fh2>\n\u003Cp>La méthode recommandée est de créer un \u003Ccode>ModuleFrontController\u003C\u002Fcode> (ou \u003Ccode>ModuleAdminController\u003C\u002Fcode>) qui reçoit l'identifiant de la commande via l'URL et génère le PDF.\u003C\u002Fp>\n\u003Ch3>Structure du module\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-\">\nmonmodule\u002F\n├── monmodule.php\n├── controllers\u002F\n│   └── front\u002F\n│       └── generatepdf.php\n└── classes\u002F\n    └── MonModulePDFGenerator.php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Le contrôleur front (PrestaShop 1.7 \u002F 8.x)\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-php\">\n&lt;?php\n\u002F**\n * Contrôleur de génération PDF\n *\u002F\nclass MonModuleGeneratepdfModuleFrontController extends ModuleFrontController\n{\n    public function initContent()\n    {\n        parent::initContent();\n\n        \u002F\u002F Récupérer l'ID commande depuis l'URL\n        $id_order = (int) Tools::getValue('id_order');\n\n        if (!$id_order) {\n            Tools::redirect('index.php?controller=history');\n        }\n\n        \u002F\u002F Vérifier que la commande appartient au client connecté\n        $order = new Order($id_order);\n        if (!Validate::isLoadedObject($order)\n            || $order-&gt;id_customer !== (int) $this-&gt;context-&gt;customer-&gt;id\n        ) {\n            Tools::redirect('index.php?controller=history');\n        }\n\n        \u002F\u002F Générer le PDF\n        $this-&gt;generateOrderPDF($order);\n    }\n\n    protected function generateOrderPDF(Order $order)\n    {\n        \u002F\u002F Utiliser la classe PDF native de PrestaShop\n        $pdf = new PDF($order, PDF::TEMPLATE_INVOICE, $this-&gt;context-&gt;smarty);\n        $pdf-&gt;render();\n        exit; \u002F\u002F Important : stopper l'exécution après l'envoi du PDF\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Appel depuis un template Smarty\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-html\">\n&lt;a href=\"{$link-&gt;getModuleLink('monmodule', 'generatepdf', ['id_order' =&gt; $order.id_order])}\" \n   class=\"btn btn-primary\" \n   target=\"_blank\"&gt;\n    Télécharger le PDF\n&lt;\u002Fa&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Alternativement, un formulaire HTML classique fonctionne tout aussi bien :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-html\">\n&lt;form method=\"GET\" action=\"{$link-&gt;getModuleLink('monmodule', 'generatepdf')}\" target=\"_blank\"&gt;\n    &lt;input type=\"hidden\" name=\"id_order\" value=\"{$order.id_order}\"&gt;\n    &lt;button type=\"submit\" class=\"btn btn-primary\"&gt;Générer le PDF&lt;\u002Fbutton&gt;\n&lt;\u002Fform&gt;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Créer un PDF personnalisé avec TCPDF\u003C\u002Fh2>\n\u003Cp>PrestaShop embarque TCPDF. Pour des documents sur mesure (attestation, certificat, bon de garantie), on peut s'en servir directement.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n&lt;?php\nclass MonModulePDFGenerator\n{\n    public static function generate(Order $order)\n    {\n        \u002F\u002F TCPDF est chargé par PrestaShop\n        $pdf = new TCPDF('P', 'mm', 'A4', true, 'UTF-8');\n        $pdf-&gt;SetCreator('Ma Boutique');\n        $pdf-&gt;SetAuthor('Ma Boutique');\n        $pdf-&gt;SetTitle('Document #' . $order-&gt;reference);\n\n        \u002F\u002F Supprimer en-tête\u002Fpied par défaut\n        $pdf-&gt;setPrintHeader(false);\n        $pdf-&gt;setPrintFooter(false);\n\n        $pdf-&gt;AddPage();\n        $pdf-&gt;SetFont('helvetica', 'B', 16);\n        $pdf-&gt;Cell(0, 15, 'Document personnalisé', 0, 1, 'C');\n\n        $pdf-&gt;SetFont('helvetica', '', 12);\n        $pdf-&gt;Cell(0, 10, 'Commande : ' . $order-&gt;reference, 0, 1);\n        $pdf-&gt;Cell(0, 10, 'Date : ' . Tools::displayDate($order-&gt;date_add), 0, 1);\n\n        \u002F\u002F Contenu HTML si besoin\n        $html = '&lt;table border=\"1\" cellpadding=\"5\"&gt;';\n        $html .= '&lt;tr&gt;&lt;th&gt;Produit&lt;\u002Fth&gt;&lt;th&gt;Quantité&lt;\u002Fth&gt;&lt;th&gt;Prix&lt;\u002Fth&gt;&lt;\u002Ftr&gt;';\n\n        $products = $order-&gt;getProducts();\n        foreach ($products as $product) {\n            $html .= '&lt;tr&gt;';\n            $html .= '&lt;td&gt;' . htmlspecialchars($product['product_name']) . '&lt;\u002Ftd&gt;';\n            $html .= '&lt;td&gt;' . (int) $product['product_quantity'] . '&lt;\u002Ftd&gt;';\n            $html .= '&lt;td&gt;' . Tools::displayPrice($product['total_price_tax_incl']) . '&lt;\u002Ftd&gt;';\n            $html .= '&lt;\u002Ftr&gt;';\n        }\n        $html .= '&lt;\u002Ftable&gt;';\n\n        $pdf-&gt;writeHTML($html, true, false, true, false, '');\n\n        \u002F\u002F Envoyer le PDF au navigateur\n        $pdf-&gt;Output('document-' . $order-&gt;reference . '.pdf', 'D');\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Côté back-office : AdminController\u003C\u002Fh2>\n\u003Cp>Pour la génération depuis le back-office, le principe est identique. On utilise un \u003Ccode>ModuleAdminController\u003C\u002Fcode> avec un token CSRF vérifié automatiquement par PrestaShop :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n&lt;?php\nclass AdminMonModulePdfController extends ModuleAdminController\n{\n    public function postProcess()\n    {\n        if (Tools::isSubmit('generateCustomPdf')) {\n            $id_order = (int) Tools::getValue('id_order');\n            $order = new Order($id_order);\n\n            if (Validate::isLoadedObject($order)) {\n                MonModulePDFGenerator::generate($order);\n                exit;\n            }\n\n            $this-&gt;errors[] = $this-&gt;l('Commande introuvable.');\n        }\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Gérer le cas où AJAX est incontournable\u003C\u002Fh2>\n\u003Cp>Si votre UX impose vraiment une requête AJAX (par exemple pour afficher un loader pendant la génération), la solution consiste à séparer la logique en deux étapes :\u003C\u002Fp>\n\u003Col>\n\u003Cli>**Requête AJAX** : prépare le PDF et le stocke temporairement sur le serveur\u003C\u002Fli>\n\u003Cli>**Redirection** : redirige vers une URL de téléchargement\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cpre>\u003Ccode class=\"language-javascript\">\n\u002F\u002F Étape 1 : préparer le PDF via AJAX\nfetch(baseUrl + 'module\u002Fmonmodule\u002Fpreparepdf', {\n    method: 'POST',\n    headers: { 'Content-Type': 'application\u002Fx-www-form-urlencoded' },\n    body: 'id_order=' + orderId + '&ajax=1'\n})\n.then(response =&gt; response.json())\n.then(data =&gt; {\n    if (data.success && data.download_url) {\n        \u002F\u002F Étape 2 : télécharger le PDF préparé\n        window.location.href = data.download_url;\n    }\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Côté PHP, le contrôleur de préparation génère le fichier, le stocke dans un dossier temporaire, et renvoie l'URL :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function displayAjaxPreparePdf()\n{\n    $id_order = (int) Tools::getValue('id_order');\n    $order = new Order($id_order);\n\n    \u002F\u002F Générer et stocker le PDF\n    $filename = 'doc_' . $order-&gt;reference . '_' . time() . '.pdf';\n    $filepath = _PS_MODULE_DIR_ . 'monmodule\u002Ftmp\u002F' . $filename;\n\n    \u002F\u002F ... logique de génération avec TCPDF ::Output($filepath, 'F') ...\n\n    $download_url = $this-&gt;context-&gt;link-&gt;getModuleLink(\n        'monmodule', 'downloadpdf', ['file' =&gt; $filename, 'token' =&gt; $this-&gt;generateSecureToken($filename)]\n    );\n\n    die(json_encode([\n        'success' =&gt; true,\n        'download_url' =&gt; $download_url\n    ]));\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\u003Cp>\u003Cstrong>Sécurité :\u003C\u002Fstrong> ne jamais exposer directement le chemin du fichier. Utilisez un token temporaire pour valider le téléchargement et supprimez le fichier après un délai raisonnable via un cron.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>Checklist de débogage PDF\u003C\u002Fh2>\n\u003Cp>Si votre PDF ne se génère pas, vérifiez ces points dans l'ordre :\u003C\u002Fp>\n\u003Ctr>\u003Cth>Vérification\u003C\u002Fth>\u003Cth>Commande \u002F Action\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Erreurs PHP masquées\u003C\u002Fth>\u003Cth>Activer le mode debug : `define('_PS_MODE_DEV_', true);`\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Sortie parasite avant le PDF\u003C\u002Fth>\u003Cth>Vérifier qu'aucun `echo`, `var_dump` ou BOM UTF-8 ne précède la sortie\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Droits d'écriture\u003C\u002Fth>\u003Cth>`chmod 755` sur le dossier temporaire du module\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Mémoire PHP suffisante\u003C\u002Fth>\u003Cth>`memory_limit` ≥ 256M pour les PDF volumineux\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>AJAX vs requête directe\u003C\u002Fth>\u003Cth>Tester l'URL du PDF directement dans le navigateur\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Objet Order valide\u003C\u002Fth>\u003Cth>Vérifier `Validate::isLoadedObject($order)` avant la génération\u003C\u002Fth>\u003C\u002Ftr>",[39,42,45,48,51],{"q":40,"a":41},"Pourquoi mon PDF PrestaShop génère une page blanche ou un fichier corrompu ?","Dans la grande majorité des cas, cela vient d'une sortie parasite (echo, var_dump, espace avant \u003C?php, BOM UTF-8) qui s'insère avant les en-têtes HTTP du PDF. Activez le mode debug PrestaShop, vérifiez vos fichiers avec un éditeur hexadécimal pour détecter un BOM, et assurez-vous qu'aucun code ne produit de sortie avant l'appel à la méthode render() ou Output() de TCPDF.",{"q":43,"a":44},"Peut-on générer un PDF via une requête AJAX dans PrestaShop ?","Pas directement. AJAX intercepte la réponse en JavaScript, ce qui empêche le navigateur de traiter le fichier binaire avec les bons en-têtes Content-Type. La solution recommandée est d'utiliser une URL directe (window.location.href) ou, si un loader AJAX est nécessaire, de séparer en deux étapes : préparation du fichier côté serveur via AJAX, puis redirection vers une URL de téléchargement.",{"q":46,"a":47},"Comment personnaliser le template PDF des factures PrestaShop ?","PrestaShop utilise des classes de templates PDF situées dans le dossier classes\u002Fpdf\u002F. Vous pouvez surcharger ces classes via un module en utilisant le mécanisme d'override ou en créant votre propre générateur avec TCPDF (embarqué nativement). Pour PrestaShop 8.x, privilégiez la surcharge par module plutôt que les overrides directs dans le dossier override\u002F, car les overrides manuels sont dépréciés au profit des services Symfony.",{"q":49,"a":50},"Quelle est la différence entre TCPDF et la classe PDF native de PrestaShop ?","La classe PDF de PrestaShop est une surcouche qui utilise TCPDF en interne, avec un système de templates Smarty pour les documents standards (factures, bons de livraison, avoirs). Pour des documents standards, utilisez la classe PDF native. Pour des documents entièrement personnalisés (attestations, certificats, rapports), utilisez TCPDF directement — il offre un contrôle total sur la mise en page.",{"q":52,"a":53},"Comment sécuriser le téléchargement de PDF générés par un module PrestaShop ?","Trois règles essentielles : vérifiez que l'utilisateur connecté a le droit d'accéder au document (comparer id_customer de la commande avec le client en session), utilisez un token CSRF ou un token temporaire pour les URLs de téléchargement, et ne stockez jamais les PDF générés dans un dossier accessible publiquement sans protection. Supprimez les fichiers temporaires via un cron après un délai raisonnable.","Pour générer un PDF dans PrestaShop, évitez AJAX et utilisez une URL directe vers un contrôleur dédié qui envoie le fichier avec les bons en-têtes HTTP. Créez un ModuleFrontController qui récupère l'ID commande via Tools::getValue(), vérifie les droits d'accès, puis appelle la classe PDF native ou TCPDF pour le rendu.",6,"2026-03-21T16:50:03.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",{"academy":141,"blog":142,"expertise":155},[],[143,148,151],{"title":144,"url":145,"score":146,"type":147},"Prestashop hosting OVH : guide complet pour e-commerçants","\u002Fblog\u002Fprestashop\u002Fperformance\u002Fprestashop-hosting-ovh-guide-complet-ecommercants",3,"blog",{"title":149,"url":150,"score":146,"type":147},"API WebService PrestaShop : guide complet pour l'intégrer en 2026","\u002Fblog\u002Fprestashop\u002Fdeveloppement\u002Fapi-webservice-prestashop-guide-complet",{"title":152,"url":153,"score":154,"type":147},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back",1,[],{"items":157},[158,167,172,178,185,193,199,204],{"id":159,"type":160,"label":161,"href":121,"icon":163,"description":163,"badge":163,"groupTitle":163,"style":163,"gridColumns":163,"cssClass":163,"psCategoryId":163,"showPsChildren":67,"position":164,"children":165,"psChildren":166},41,"link",{"fr":162},"Expertise",null,0,[],[],{"id":168,"type":160,"label":169,"href":112,"icon":163,"description":163,"badge":163,"groupTitle":163,"style":163,"gridColumns":163,"cssClass":163,"psCategoryId":163,"showPsChildren":67,"position":154,"children":170,"psChildren":171},42,{"fr":111},[],[],{"id":173,"type":160,"label":174,"href":73,"icon":163,"description":163,"badge":163,"groupTitle":163,"style":163,"gridColumns":163,"cssClass":163,"psCategoryId":163,"showPsChildren":67,"position":175,"children":176,"psChildren":177},43,{"fr":72},2,[],[],{"id":179,"type":160,"label":180,"href":182,"icon":163,"description":163,"badge":163,"groupTitle":163,"style":163,"gridColumns":163,"cssClass":163,"psCategoryId":163,"showPsChildren":67,"position":146,"children":183,"psChildren":184},44,{"fr":181},"Outils IA","\u002Foutils-ia",[],[],{"id":186,"type":160,"label":187,"href":66,"icon":163,"description":163,"badge":163,"groupTitle":163,"style":189,"gridColumns":163,"cssClass":163,"psCategoryId":163,"showPsChildren":67,"position":190,"children":191,"psChildren":192},45,{"fr":188},"Offre Starter ✨",{"highlight":20},4,[],[],{"id":194,"type":160,"label":195,"href":115,"icon":163,"description":163,"badge":163,"groupTitle":163,"style":163,"gridColumns":163,"cssClass":163,"psCategoryId":163,"showPsChildren":67,"position":196,"children":197,"psChildren":198},46,{"fr":114},5,[],[],{"id":200,"type":160,"label":201,"href":133,"icon":163,"description":163,"badge":163,"groupTitle":163,"style":163,"gridColumns":163,"cssClass":163,"psCategoryId":163,"showPsChildren":67,"position":55,"children":202,"psChildren":203},47,{"fr":129},[],[],{"id":205,"type":160,"label":206,"href":139,"icon":163,"description":163,"badge":163,"groupTitle":163,"style":163,"gridColumns":163,"cssClass":163,"psCategoryId":163,"showPsChildren":67,"position":207,"children":208,"psChildren":209},48,{"fr":138},7,[],[],{"footer":211},{"theme":212,"description":163,"hours":163,"logo":213,"contact":216,"social":217,"bottomBar":227},"dark",{"src":214,"href":215,"alt":132},"\u002Flogo-ac.svg","\u002F",{"email":163,"phone":163,"address":163,"cta":163},[218,221,224],{"platform":219,"href":220,"label":219},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":222,"href":223,"label":222},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":225,"href":226,"label":225},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":163},{"header":229},{"logo":230,"topBar":233,"contactEmail":236,"features":237,"navBar":163},{"src":214,"alt":231,"text":132,"href":215,"class":232},"Alexandre Carette — Architecte E-commerce Souverain","h-10 w-10",{"message":163,"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"]