[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fyqvOWSURbu1AFpNu0tOVbKNDMEeqHc0e-MlUKBQ0aT4":22,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":60,"megamenu":141,"header-db":197,"footer-db":210,"$fErhfSgAdd3WlfHJq6bfdFFCItrghradhrUM7zOj1MMQ":226},{"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},"Ajouter un champ date personnalisé aux détails de commande PrestaShop","ajouter-champ-date-personnalise-details-commande-prestashop","Guide complet pour ajouter une date de livraison aux lignes de commande PrestaShop : override OrderDetail, requêtes SQL, AJAX et bonnes pratiques ObjectModel.","developpement",[28,29,30,31,32,33],"OrderDetail","override","ObjectModel","AJAX","back-office","personnalisation commande","intermediaire",[36,37],"1.7","8.x","\u003Ch2>Pourquoi ajouter une date personnalisée aux lignes de commande ?\u003C\u002Fh2>\n\u003Cp>Dans de nombreux contextes e-commerce — livraison planifiée, production sur-mesure, précommande — il est indispensable d'associer une \u003Cstrong>date spécifique à chaque ligne de commande\u003C\u002Fstrong> (et non à la commande globale). PrestaShop ne propose pas cette fonctionnalité nativement : la table \u003Ccode>ps_order_detail\u003C\u002Fcode> ne contient aucun champ de date personnalisable.\u003C\u002Fp>\n\u003Cp>Cet article détaille la méthode propre pour ajouter un champ \u003Ccode>date_livraison\u003C\u002Fcode> aux détails de commande, avec mise à jour via AJAX depuis le back-office.\u003C\u002Fp>\n\u003Ch2>Étape 1 : Ajouter la colonne en base de données\u003C\u002Fh2>\n\u003Cp>Avant toute chose, on ajoute le champ dans la table \u003Ccode>ps_order_detail\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nALTER TABLE `ps_order_detail`\n  ADD COLUMN `date_livraison` DATETIME NULL DEFAULT NULL\n  AFTER `product_quantity`;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>Pourquoi ne pas créer une table séparée ?\u003C\u002Fstrong> Sauf besoin d'historiser les changements de date, ajouter un champ directement dans \u003Ccode>ps_order_detail\u003C\u002Fcode> est plus simple et plus performant. Une table séparée n'est justifiée que si vous devez conserver un journal des modifications (audit trail).\u003C\u002Fp>\n\u003Cblockquote>\u003Cp>\u003Cstrong>PrestaShop 8.x :\u003C\u002Fstrong> La structure de \u003Ccode>ps_order_detail\u003C\u002Fcode> est identique. Cette requête fonctionne sur toutes les versions 1.7+ et 8.x.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>Étape 2 : Override de la classe OrderDetail\u003C\u002Fh2>\n\u003Cp>Pour que PrestaShop reconnaisse le nouveau champ via son ORM (ObjectModel), il faut créer un override :\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Fichier :\u003C\u002Fstrong> \u003Ccode>override\u002Fclasses\u002Forder\u002FOrderDetail.php\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n&lt;?php\n\u002F**\n * Override OrderDetail — Ajout du champ date_livraison\n *\u002F\nclass OrderDetail extends OrderDetailCore\n{\n    \u002F** @var string Date de livraison prévue *\u002F\n    public $date_livraison;\n\n    public function __construct($id = null, $id_lang = null, $context = null)\n    {\n        \u002F\u002F Déclaration du champ AVANT l'appel au constructeur parent\n        self::$definition['fields']['date_livraison'] = [\n            'type' =&gt; self::TYPE_DATE,\n            'validate' =&gt; 'isDate',\n        ];\n\n        parent::__construct($id, $id_lang, $context);\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>Point critique :\u003C\u002Fstrong> après avoir créé cet override, supprimez le fichier \u003Ccode>var\u002Fcache\u002Fdev\u002Fclass_index.php\u003C\u002Fcode> et \u003Ccode>var\u002Fcache\u002Fprod\u002Fclass_index.php\u003C\u002Fcode> (ou \u003Ccode>cache\u002Fclass_index.php\u003C\u002Fcode> en 1.7) pour forcer PrestaShop à recharger l'index des classes.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">\nrm -f var\u002Fcache\u002Fdev\u002Fclass_index.php var\u002Fcache\u002Fprod\u002Fclass_index.php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\u003Cp>\u003Cstrong>PrestaShop 8.x :\u003C\u002Fstrong> Le système d'override fonctionne toujours, mais Symfony encourage les décorateurs de service pour les classes injectées. \u003Ccode>OrderDetail\u003C\u002Fcode> étant un ObjectModel legacy, l'override reste la méthode recommandée.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Ch2>Étape 3 : Mise à jour via ObjectModel (la bonne méthode)\u003C\u002Fh2>\n\u003Cp>Une erreur fréquente consiste à écrire des requêtes SQL brutes (\u003Ccode>INSERT INTO\u003C\u002Fcode>, \u003Ccode>UPDATE\u003C\u002Fcode>) pour modifier les données. PrestaShop fournit un ORM natif — utilisez-le :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F\u002F Récupérer tous les détails d'une commande\n$orderDetails = Db::getInstance()-&gt;executeS(\n    'SELECT `id_order_detail`\n     FROM `' . _DB_PREFIX_ . 'order_detail`\n     WHERE `id_order` = ' . (int) $idOrder\n);\n\n\u002F\u002F Mettre à jour la date sur chaque ligne\nforeach ($orderDetails as $row) {\n    $detail = new OrderDetail((int) $row['id_order_detail']);\n    $detail-&gt;date_livraison = pSQL($dateLivraison); \u002F\u002F Format: 'Y-m-d H:i:s'\n    $detail-&gt;update();\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Pourquoi ObjectModel plutôt que du SQL brut ?\u003C\u002Fh3>\n\u003Ctr>\u003Cth>Approche\u003C\u002Fth>\u003Cth>Avantages\u003C\u002Fth>\u003Cth>Inconvénients\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`new OrderDetail($id)` + `->update()`\u003C\u002Fth>\u003Cth>Validation automatique, hooks déclenchés, cache invalidé\u003C\u002Fth>\u003Cth>Légèrement plus lent (1 requête par ligne)\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>`Db::getInstance()->execute()`\u003C\u002Fth>\u003Cth>Rapide, une seule requête possible\u003C\u002Fth>\u003Cth>Pas de validation, hooks ignorés, risque d'injection SQL\u003C\u002Fth>\u003C\u002Ftr>\n\u003Cp>Pour des mises à jour massives (centaines de lignes), le SQL direct avec \u003Ccode>pSQL()\u003C\u002Fcode> reste acceptable. Pour le back-office classique, ObjectModel est la voie propre.\u003C\u002Fp>\n\u003Ch2>Étape 4 : Appel AJAX depuis le back-office\u003C\u002Fh2>\n\u003Cp>Côté JavaScript, dans le template de la page commande :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-javascript\">\ndocument.getElementById('btn-save-date').addEventListener('click', function () {\n    const idOrder = parseInt(document.getElementById('id_order').value, 10);\n    const dateLiv = document.getElementById('date_livraison').value;\n\n    if (!idOrder || !dateLiv) {\n        console.error('ID commande ou date manquante');\n        return;\n    }\n\n    fetch(ajaxUrl, {\n        method: 'POST',\n        headers: {\n            'Content-Type': 'application\u002Fx-www-form-urlencoded',\n        },\n        body: new URLSearchParams({\n            ajax: 1,\n            action: 'updateDateLivraison',\n            id_order: idOrder,\n            date_livraison: dateLiv,\n        }),\n    })\n    .then(response =&gt; response.json())\n    .then(data =&gt; {\n        if (data.success) {\n            \u002F\u002F Feedback visuel\n            alert('Date enregistrée');\n        }\n    })\n    .catch(err =&gt; console.error('Erreur AJAX:', err));\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Pièges courants de l'appel AJAX\u003C\u002Fh3>\n\u003Col>\n\u003Cli>**`console.log(id_order)` en premier** — Toujours vérifier que la valeur est bien récupérée avant d'envoyer la requête.\u003C\u002Fli>\n\u003Cli>**Vérifier le type** — `id_order` doit être un entier. Si vous récupérez une chaîne depuis le DOM, castez-la avec `parseInt()` côté JS et `(int)` côté PHP.\u003C\u002Fli>\n\u003Cli>**Format de date** — MySQL attend `Y-m-d H:i:s`. Un datepicker HTML5 renvoie `Y-m-d` : ajoutez ` 00:00:00` si nécessaire.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Étape 5 : Traitement côté contrôleur\u003C\u002Fh2>\n\u003Cp>Dans votre module ou contrôleur admin :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\npublic function ajaxProcessUpdateDateLivraison()\n{\n    $idOrder = (int) Tools::getValue('id_order');\n    $dateLivraison = pSQL(Tools::getValue('date_livraison'));\n\n    if (!$idOrder || !Validate::isDate($dateLivraison)) {\n        die(json_encode(['success' =&gt; false, 'error' =&gt; 'Paramètres invalides']));\n    }\n\n    $orderDetails = Db::getInstance()-&gt;executeS(\n        'SELECT `id_order_detail`\n         FROM `' . _DB_PREFIX_ . 'order_detail`\n         WHERE `id_order` = ' . $idOrder\n    );\n\n    foreach ($orderDetails as $row) {\n        $detail = new OrderDetail((int) $row['id_order_detail']);\n        $detail-&gt;date_livraison = $dateLivraison;\n        $detail-&gt;update();\n    }\n\n    die(json_encode(['success' =&gt; true]));\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Points d'attention\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>**`getValue` vs `executeS`** : `getValue` retourne une seule valeur. Pour récupérer plusieurs lignes (une commande a potentiellement plusieurs produits), utilisez `executeS` qui retourne un tableau.\u003C\u002Fli>\n\u003Cli>**Le `return` dans le `foreach`** : une erreur classique consiste à placer le traitement SQL en dehors de la boucle. La requête ne s'exécute alors que pour la dernière ligne. Chaque itération doit traiter sa propre ligne.\u003C\u002Fli>\n\u003Cli>**Casting `(int)`** : indispensable pour tout identifiant passé dans une requête SQL. Sans cela, vous envoyez une chaîne là où la base attend un entier, ce qui provoque des erreurs silencieuses.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Techniques de débogage essentielles\u003C\u002Fh2>\n\u003Cp>Quand une requête ne fonctionne pas, voici la méthodologie systématique :\u003C\u002Fp>\n\u003Ch3>1. Vérifier les variables avec var_dump\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-php\">\nforeach ($orderDetails as $row) {\n    var_dump($row['id_order_detail']); \u002F\u002F Vérifier le type et la valeur\n    echo '&lt;br\u002F&gt;';\n    var_dump($dateLivraison);          \u002F\u002F Vérifier le format de date\n    die(); \u002F\u002F Arrêter après la première itération\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>2. Tester la requête dans phpMyAdmin\u003C\u002Fh3>\n\u003Cp>Avant d'encapsuler une requête en PHP, testez-la en SQL pur :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-sql\">\nUPDATE ps_order_detail\n   SET date_livraison = '2026-03-15 00:00:00'\n WHERE id_order_detail = 285;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>phpMyAdmin vous indiquera immédiatement si le nom de colonne est incorrect, si le type est incompatible, ou si une contrainte bloque l'opération.\u003C\u002Fp>\n\u003Ch3>3. Vérifier le retour de la requête\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-php\">\n$result = Db::getInstance()-&gt;execute($sql);\nvar_dump($result); \u002F\u002F true = succès, false = erreur SQL\ndie();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Erreurs fréquentes et solutions\u003C\u002Fh2>\n\u003Ctr>\u003Cth>Erreur\u003C\u002Fth>\u003Cth>Cause\u003C\u002Fth>\u003Cth>Solution\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>La date ne s'enregistre pas\u003C\u002Fth>\u003Cth>Variable non castée en `(int)` pour l'ID\u003C\u002Fth>\u003Cth>`(int) $row['id_order_detail']`\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Mise à jour sur une seule ligne\u003C\u002Fth>\u003Cth>`return` placé en dehors du `foreach`\u003C\u002Fth>\u003Cth>Déplacer le traitement dans la boucle\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Erreur SQL silencieuse\u003C\u002Fth>\u003Cth>Nom de colonne incorrect dans la requête\u003C\u002Fth>\u003Cth>Vérifier avec `DESCRIBE ps_order_detail`\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Format de date rejeté\u003C\u002Fth>\u003Cth>Date au mauvais format\u003C\u002Fth>\u003Cth>Utiliser `date('Y-m-d H:i:s', strtotime($input))`\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>Override non pris en compte\u003C\u002Fth>\u003Cth>Cache de classe non vidé\u003C\u002Fth>\u003Cth>Supprimer `class_index.php`\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ch2>Bonne pratique : faut-il une table séparée ?\u003C\u002Fh2>\n\u003Cp>Si votre besoin est simplement de stocker une date par ligne de commande, \u003Cstrong>ajoutez un champ à \u003Ccode>ps_order_detail\u003C\u002Fcode>\u003C\u002Fstrong> avec un override. C'est simple, performant et maintenable.\u003C\u002Fp>\n\u003Cp>En revanche, si vous devez :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Historiser chaque modification de date (qui a changé quoi, quand)\u003C\u002Fli>\n\u003Cli>Stocker plusieurs dates par ligne (date prévue, date réelle, date reportée)\u003C\u002Fli>\n\u003Cli>Ajouter des métadonnées complexes (commentaire, statut de livraison)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Alors créez une table dédiée avec son propre ObjectModel. Dans ce cas, assurez-vous que :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>L'`id` primaire est en **auto-increment**\u003C\u002Fli>\n\u003Cli>Vous créez une classe ObjectModel complète (pas du SQL brut)\u003C\u002Fli>\n\u003Cli>Un index existe sur `id_order_detail` pour les performances de jointure\u003C\u002Fli>\n\u003C\u002Ful>",[40,43,46,49,52],{"q":41,"a":42},"Comment ajouter un champ personnalisé à la table order_detail de PrestaShop ?","Ajoutez d'abord la colonne via ALTER TABLE, puis créez un override de la classe OrderDetail dans override\u002Fclasses\u002Forder\u002FOrderDetail.php. Déclarez la propriété publique et ajoutez-la dans self::$definition['fields'] avec le type approprié (TYPE_DATE, TYPE_STRING, etc.). N'oubliez pas de supprimer le fichier class_index.php du cache pour que PrestaShop détecte l'override.",{"q":44,"a":45},"Pourquoi ma requête SQL UPDATE ne fonctionne pas dans PrestaShop ?","Les causes les plus fréquentes sont : un identifiant non casté en (int) envoyé comme chaîne dans la requête, un nom de colonne incorrect (vérifiez avec DESCRIBE dans phpMyAdmin), ou un return placé hors de la boucle foreach. Utilisez var_dump() et die() pour inspecter chaque variable, et testez toujours votre requête SQL en pur dans phpMyAdmin avant de l'intégrer en PHP.",{"q":47,"a":48},"Quelle est la différence entre getValue et executeS dans PrestaShop ?","getValue() retourne une seule valeur scalaire (une cellule), tandis que executeS() retourne un tableau de résultats (plusieurs lignes). Pour récupérer tous les détails d'une commande (qui contient généralement plusieurs produits), utilisez executeS(). Utiliser getValue() dans ce contexte ne retournerait que le premier résultat et ignorerait les autres lignes.",{"q":50,"a":51},"Faut-il créer une nouvelle table ou ajouter un champ à ps_order_detail ?","Pour un simple champ date ou texte, ajoutez directement une colonne à ps_order_detail via un override — c'est plus simple et plus performant. Créez une table séparée uniquement si vous avez besoin d'historiser les modifications, de stocker plusieurs valeurs par ligne de commande, ou d'ajouter des métadonnées complexes. Dans ce cas, créez un ObjectModel dédié avec une clé primaire auto-increment.",{"q":53,"a":54},"Comment envoyer une date en AJAX vers un contrôleur PrestaShop ?","Envoyez la date au format Y-m-d ou Y-m-d H:i:s via une requête POST en application\u002Fx-www-form-urlencoded. Côté PHP, récupérez-la avec Tools::getValue(), validez-la avec Validate::isDate(), et sécurisez-la avec pSQL() avant insertion. Côté JavaScript, vérifiez toujours que l'id_order est bien un entier avec parseInt() avant l'envoi.","Pour ajouter une date personnalisée aux lignes de commande PrestaShop, ajoutez une colonne à ps_order_detail, créez un override d'OrderDetail pour déclarer le champ dans l'ObjectModel, puis mettez à jour via AJAX avec instanciation propre de l'objet et casting systématique des identifiants en (int).",6,"2026-03-21T12:52:36.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,[],[],{"header":198},{"logo":199,"topBar":204,"contactEmail":207,"features":208,"navBar":148},{"src":200,"alt":201,"text":133,"href":202,"class":203},"\u002Flogo-ac.svg","Alexandre Carette — Architecte E-commerce Souverain","\u002F","h-10 w-10",{"message":148,"showLanguages":68,"align":205,"languages":206},"left",[],"contact@alexandrecarette.fr",{"showSearch":68,"showWishlist":68,"showLogin":20,"showContact":68,"showCart":68,"stickyHeader":20,"headerLayout":209},"inline",{"footer":211},{"theme":212,"description":148,"hours":148,"logo":213,"contact":214,"social":215,"bottomBar":225},"dark",{"src":200,"href":202,"alt":133},{"email":148,"phone":148,"address":148,"cta":148},[216,219,222],{"platform":217,"href":218,"label":217},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":220,"href":221,"label":220},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":223,"href":224,"label":223},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":148},{"academy":227,"blog":228,"expertise":239},[],[229,233,236],{"title":230,"url":231,"score":155,"type":232},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back","blog",{"title":234,"url":235,"score":155,"type":232},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":237,"url":238,"score":155,"type":232},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[]]