[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fevfb3y48Q6yLBnfROLLZl5hdzhAZXcgUB2wkEjkVUio":22,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":61,"megamenu":142,"header-db":198,"$fm2M-HFzV-dwpolUnvqR9bn9WoA7F5rMGQ0emywsB32A":211,"footer-db":225},{"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},"Rendre le numéro de TVA obligatoire si société renseignée sur PrestaShop","tva-obligatoire-si-societe-prestashop","Comment rendre le champ TVA intracommunautaire obligatoire conditionnellement quand une société est saisie sur PrestaShop 1.6, 1.7 et 8.x. Override propre et validation.","developpement",[28,29,30,31,32,33],"TVA","validation formulaire","override controller","B2B","adresse","numéro intracommunautaire","intermediaire",[36,37,38],"1.6","1.7","8.x","\u003Ch2>Le problème : TVA facultative même quand une société est renseignée\u003C\u002Fh2>\n\u003Cp>Par défaut, PrestaShop ne rend jamais le numéro de TVA intracommunautaire obligatoire. Que le client saisisse ou non un nom de société, le champ reste optionnel. C'est un vrai problème pour les marchands B2B qui ont besoin du numéro de TVA pour établir des factures conformes, appliquer l'autoliquidation ou simplement vérifier la légitimité d'un achat professionnel.\u003C\u002Fp>\n\u003Cp>La logique métier attendue est simple : \u003Cstrong>si le client renseigne un nom de société, alors le numéro de TVA intracommunautaire doit devenir obligatoire\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Ch2>Comprendre l'architecture des formulaires d'adresse\u003C\u002Fh2>\n\u003Cp>Avant de modifier quoi que ce soit, il faut comprendre que la validation de l'adresse intervient à \u003Cstrong>deux endroits distincts\u003C\u002Fstrong> dans PrestaShop :\u003C\u002Fp>\n\u003Col>\n\u003Cli>**À l'inscription** — Le contrôleur `AuthController` gère la soumission du formulaire de création de compte (méthode `processSubmitAccount()`)\u003C\u002Fli>\n\u003Cli>**À l'ajout\u002Fmodification d'adresse** — Le contrôleur `AddressController` gère le carnet d'adresses (méthode `processSubmitAddress()`)\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Si vous ne modifiez qu'un seul de ces deux contrôleurs, la validation sera incomplète : un client pourra contourner l'obligation en ajoutant son adresse professionnelle après l'inscription.\u003C\u002Fp>\n\u003Ch3>Le module European VAT Number\u003C\u002Fh3>\n\u003Cp>PrestaShop embarque un module natif appelé \u003Cstrong>European VAT Number\u003C\u002Fstrong> (anciennement \u003Ccode>vatnumber\u003C\u002Fcode>, renommé en module plus complet sur les versions récentes). Ce module ajoute le champ TVA dans les formulaires d'adresse et peut effectuer une vérification VIES. Cependant, \u003Cstrong>il ne gère pas la logique de champ conditionnel obligatoire\u003C\u002Fstrong>. C'est donc une personnalisation à implémenter côté contrôleur.\u003C\u002Fp>\n\u003Cp>Assurez-vous que ce module est bien installé et activé avant de poursuivre.\u003C\u002Fp>\n\u003Ch2>Solution pour PrestaShop 1.6\u003C\u002Fh2>\n\u003Cp>Sur PrestaShop 1.6, la méthode la plus propre consiste à créer des \u003Cstrong>overrides\u003C\u002Fstrong> des deux contrôleurs front-office. Évitez absolument de modifier les fichiers core directement : chaque mise à jour écraserait vos modifications.\u003C\u002Fp>\n\u003Ch3>Override de AuthController\u003C\u002Fh3>\n\u003Cp>Créez le fichier \u003Ccode>override\u002Fcontrollers\u002Ffront\u002FAuthController.php\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n&lt;?php\nclass AuthController extends AuthControllerCore\n{\n    protected function processSubmitAccount()\n    {\n        \u002F\u002F Appel de la méthode parente\n        parent::processSubmitAccount();\n\n        \u002F\u002F Vérification TVA conditionnelle : obligatoire si société renseignée\n        if (!empty(Tools::getValue('company'))) {\n            $vatNumber = Tools::getValue('vat_number');\n            if (empty($vatNumber)) {\n                $this-&gt;errors[] = Tools::displayError(\n                    'Le numéro de TVA intracommunautaire est obligatoire pour les professionnels.'\n                );\n            }\n        }\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Override de AddressController\u003C\u002Fh3>\n\u003Cp>Créez le fichier \u003Ccode>override\u002Fcontrollers\u002Ffront\u002FAddressController.php\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n&lt;?php\nclass AddressController extends AddressControllerCore\n{\n    protected function processSubmitAddress()\n    {\n        \u002F\u002F Vérification TVA conditionnelle avant le traitement standard\n        $address = new Address();\n        $address-&gt;company = Tools::getValue('company');\n\n        if (!empty($address-&gt;company)) {\n            $vatNumber = Tools::getValue('vat_number');\n            if (empty($vatNumber)) {\n                $this-&gt;errors[] = Tools::displayError(\n                    'Le numéro de TVA intracommunautaire est obligatoire pour les professionnels.'\n                );\n            }\n        }\n\n        \u002F\u002F Si pas d'erreur, on laisse le contrôleur parent traiter l'adresse\n        if (empty($this-&gt;errors)) {\n            parent::processSubmitAddress();\n        }\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>Important :\u003C\u002Fstrong> Après avoir créé ces fichiers, supprimez le cache des classes :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">\nrm -f var\u002Fcache\u002Fclass_index.php   # PS 1.6\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Solution pour PrestaShop 1.7 et 8.x\u003C\u002Fh2>\n\u003Cp>À partir de PrestaShop 1.7, l'architecture des formulaires a été entièrement repensée avec le système de \u003Cstrong>Form Builders\u003C\u002Fstrong> basé sur Symfony. Les overrides de contrôleurs front restent possibles, mais la méthode recommandée passe par un \u003Cstrong>module avec hook\u003C\u002Fstrong>.\u003C\u002Fp>\n\u003Ch3>Approche recommandée : module avec validation par hook\u003C\u002Fh3>\n\u003Cp>Créez un module \u003Ccode>ac_vatRequired\u003C\u002Fcode> qui écoute le hook \u003Ccode>actionValidateCustomerAddressForm\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n&lt;?php\n\u002F\u002F modules\u002Fac_vatrequired\u002Fac_vatrequired.php\n\nuse PrestaShop\\PrestaShop\\Core\\Form\\FormHandlerInterface;\n\nclass Ac_VatRequired extends Module\n{\n    public function __construct()\n    {\n        $this-&gt;name = 'ac_vatrequired';\n        $this-&gt;version = '1.0.0';\n        $this-&gt;author = 'Alexandre Carette';\n        $this-&gt;tab = 'billing_invoicing';\n        $this-&gt;need_instance = 0;\n        $this-&gt;ps_versions_compliancy = ['min' =&gt; '1.7.0.0', 'max' =&gt; '8.99.99'];\n\n        parent::__construct();\n\n        $this-&gt;displayName = $this-&gt;l('TVA obligatoire si société');\n        $this-&gt;description = $this-&gt;l('Rend le numéro de TVA obligatoire quand une société est renseignée.');\n    }\n\n    public function install()\n    {\n        return parent::install()\n            && $this-&gt;registerHook('actionValidateCustomerAddressForm');\n    }\n\n    \u002F**\n     * Hook de validation du formulaire d'adresse (PS 1.7+)\n     *\u002F\n    public function hookActionValidateCustomerAddressForm(array $params)\n    {\n        \u002F** @var PrestaShop\\PrestaShop\\Core\\Domain\\Address\\ValueObject\\Address $form *\u002F\n        $form = $params['form'];\n\n        $company = $form-&gt;getField('company')-&gt;getValue();\n        $vatNumber = $form-&gt;getField('vat_number')-&gt;getValue();\n\n        if (!empty($company) && empty($vatNumber)) {\n            $form-&gt;getField('vat_number')-&gt;addError(\n                $this-&gt;l('Le numéro de TVA intracommunautaire est obligatoire pour les professionnels.')\n            );\n        }\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Vérification côté template (optionnel)\u003C\u002Fh3>\n\u003Cp>Pour améliorer l'expérience utilisateur, vous pouvez ajouter une validation JavaScript côté front qui affiche dynamiquement l'astérisque d'obligation quand le champ société est rempli :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-javascript\">\n\u002F\u002F views\u002Fjs\u002Fac_vatrequired.js\ndocument.addEventListener('DOMContentLoaded', function () {\n  const companyField = document.querySelector('input[name=\"company\"]');\n  const vatGroup = document.querySelector('input[name=\"vat_number\"]')?.closest('.form-group');\n  const vatLabel = vatGroup?.querySelector('label');\n\n  if (!companyField || !vatGroup) return;\n\n  function toggleVatRequired() {\n    const isCompany = companyField.value.trim() !== '';\n    const vatInput = vatGroup.querySelector('input[name=\"vat_number\"]');\n\n    if (isCompany) {\n      vatInput.setAttribute('required', 'required');\n      if (vatLabel && !vatLabel.textContent.includes('*')) {\n        vatLabel.textContent += ' *';\n      }\n    } else {\n      vatInput.removeAttribute('required');\n      if (vatLabel) {\n        vatLabel.textContent = vatLabel.textContent.replace(' *', '');\n      }\n    }\n  }\n\n  companyField.addEventListener('input', toggleVatRequired);\n  toggleVatRequired();\n});\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Le piège de la définition du champ dans la classe Address\u003C\u002Fh2>\n\u003Cp>Dans la classe \u003Ccode>Address.php\u003C\u002Fcode>, le champ \u003Ccode>vat_number\u003C\u002Fcode> est défini ainsi :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n'vat_number' =&gt; array('type' =&gt; self::TYPE_STRING, 'validate' =&gt; 'isGenericName'),\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Notez qu'il n'y a \u003Cstrong>pas de clé \u003Ccode>required' => true\u003C\u002Fcode>\u003C\u002Fstrong>. C'est normal : la classe \u003Ccode>Address\u003C\u002Fcode> gère la définition statique du champ, pas sa logique conditionnelle. N'ajoutez surtout pas \u003Ccode>'required' => true\u003C\u002Fcode> ici, car cela rendrait le numéro de TVA obligatoire pour \u003Cstrong>tous les clients\u003C\u002Fstrong>, y compris les particuliers. La validation conditionnelle doit rester dans le contrôleur ou le module.\u003C\u002Fp>\n\u003Ch2>Vérification VIES : aller plus loin\u003C\u002Fh2>\n\u003Cp>Rendre le champ obligatoire c'est bien, mais valider que le numéro est réel c'est mieux. PrestaShop 8.x intègre nativement la vérification via le service VIES de la Commission européenne. Si vous utilisez une version antérieure ou souhaitez une validation plus robuste :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F**\n * Vérifie un numéro de TVA intracommunautaire via VIES\n *\u002F\nfunction checkVatVies(string $vatNumber): bool\n{\n    $vatNumber = str_replace([' ', '.', '-'], '', strtoupper($vatNumber));\n    $countryCode = substr($vatNumber, 0, 2);\n    $number = substr($vatNumber, 2);\n\n    try {\n        $client = new SoapClient('https:\u002F\u002Fec.europa.eu\u002Ftaxation_customs\u002Fvies\u002FcheckVatService.wsdl');\n        $result = $client-&gt;checkVat([\n            'countryCode' =&gt; $countryCode,\n            'vatNumber' =&gt; $number,\n        ]);\n        return (bool) $result-&gt;valid;\n    } catch (SoapFault $e) {\n        \u002F\u002F Le service VIES peut être temporairement indisponible\n        \u002F\u002F En cas d'erreur, on accepte le numéro et on log l'incident\n        PrestaShopLogger::addLog(\n            'VIES check failed: ' . $e-&gt;getMessage(),\n            2,\n            null,\n            'Address'\n        );\n        return true;\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Récapitulatif des fichiers à créer ou modifier\u003C\u002Fh2>\n\u003Ctr>\u003Cth>Version\u003C\u002Fth>\u003Cth>Fichier\u003C\u002Fth>\u003Cth>Action\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>PS 1.6\u003C\u002Fth>\u003Cth>`override\u002Fcontrollers\u002Ffront\u002FAuthController.php`\u003C\u002Fth>\u003Cth>Override — validation inscription\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>PS 1.6\u003C\u002Fth>\u003Cth>`override\u002Fcontrollers\u002Ffront\u002FAddressController.php`\u003C\u002Fth>\u003Cth>Override — validation adresse\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>PS 1.7+ \u002F 8.x\u003C\u002Fth>\u003Cth>`modules\u002Fac_vatrequired\u002Fac_vatrequired.php`\u003C\u002Fth>\u003Cth>Module — hook validation\u003C\u002Fth>\u003C\u002Ftr>\n\u003Ctr>\u003Cth>PS 1.7+ \u002F 8.x\u003C\u002Fth>\u003Cth>`modules\u002Fac_vatrequired\u002Fviews\u002Fjs\u002Fac_vatrequired.js`\u003C\u002Fth>\u003Cth>UX — astérisque dynamique\u003C\u002Fth>\u003C\u002Ftr>\n\u003Cp>\u003Cstrong>Règle d'or :\u003C\u002Fstrong> ne modifiez jamais directement les fichiers du core PrestaShop. Utilisez le système d'overrides (PS 1.6) ou les hooks modules (PS 1.7+\u002F8.x) pour garantir la pérennité de vos modifications lors des mises à jour.\u003C\u002Fp>",[41,44,47,50,53],{"q":42,"a":43},"Comment rendre le numéro de TVA obligatoire uniquement pour les professionnels sur PrestaShop ?","La méthode consiste à ajouter une validation conditionnelle : si le champ 'société' est renseigné, alors le numéro de TVA devient obligatoire. Sur PrestaShop 1.6, créez des overrides de AuthController et AddressController. Sur PrestaShop 1.7 et 8.x, utilisez un module qui écoute le hook actionValidateCustomerAddressForm pour injecter cette logique de validation.",{"q":45,"a":46},"Faut-il modifier la classe Address.php pour rendre le champ TVA obligatoire ?","Non. La classe Address.php définit le type et la validation du champ, mais y ajouter 'required' => true rendrait la TVA obligatoire pour TOUS les clients, y compris les particuliers. La logique conditionnelle (obligatoire seulement si société renseignée) doit être implémentée dans le contrôleur ou via un hook module.",{"q":48,"a":49},"Le module European VAT Number de PrestaShop rend-il automatiquement le champ TVA obligatoire ?","Non. Le module European VAT Number (vatnumber) ajoute le champ TVA dans les formulaires d'adresse et peut vérifier sa validité via le service VIES de la Commission européenne. Cependant, il ne gère pas la logique de champ conditionnel obligatoire. Vous devez ajouter cette validation vous-même via un override ou un module personnalisé.",{"q":51,"a":52},"Comment vérifier qu'un numéro de TVA intracommunautaire est valide sur PrestaShop ?","Utilisez le service VIES (VAT Information Exchange System) de la Commission européenne. PrestaShop 8.x intègre cette vérification nativement via le module European VAT Number. Pour les versions antérieures, vous pouvez appeler le webservice SOAP de VIES (checkVatService.wsdl) pour valider en temps réel que le numéro existe et correspond à une entreprise active.",{"q":54,"a":55},"Pourquoi faut-il modifier deux contrôleurs différents pour la validation TVA ?","PrestaShop traite l'adresse à deux endroits : AuthController lors de l'inscription (processSubmitAccount) et AddressController lors de l'ajout ou la modification d'adresse (processSubmitAddress). Si vous ne modifiez qu'un seul contrôleur, un client pourra contourner l'obligation en ajoutant son adresse professionnelle après l'inscription, ou inversement.","Pour rendre le numéro de TVA obligatoire quand une société est renseignée, il faut ajouter une validation conditionnelle dans les contrôleurs AuthController et AddressController (PS 1.6 via override) ou via un module avec le hook actionValidateCustomerAddressForm (PS 1.7+\u002F8.x). Ne jamais modifier la classe Address.php pour cela.",6,"2026-03-21T13:09:13.000Z",[],"PrestaShop pour les développeurs",{"columns":62},[63,79,109,130],{"title":64,"links":65},"Plateforme",[66,70,73,76],{"label":67,"href":68,"external":69},"Offre Starter (2 500 €)","\u002Foffre-starter",false,{"label":71,"href":72,"external":69},"Devenir Ambassadeur","\u002Fambassadeur",{"label":74,"href":75,"external":69},"Modules PrestaShop","\u002Fmodules",{"label":77,"href":78,"external":20},"CodeMyShop.com","https:\u002F\u002Fcodemyshop.com",{"title":80,"links":81},"Le Synedre",[82,85,88,91,94,97,100,103,106],{"label":83,"href":84,"external":69},"L'histoire","\u002Fsynedre",{"label":86,"href":87,"external":69},"Constitution","\u002Fsynedre\u002Fconstitution",{"label":89,"href":90,"external":69},"L'équipe","\u002Fequipe",{"label":92,"href":93,"external":69},"Le réacteur en direct","\u002Freacteur",{"label":95,"href":96,"external":69},"Le Drill (entraînement)","\u002Fdrill",{"label":98,"href":99,"external":69},"Protocole de réunion","\u002Fsynedre\u002Freunion",{"label":101,"href":102,"external":69},"Les agents IA","\u002Fagents-ia",{"label":104,"href":105,"external":69},"La Conduite","\u002Fsynedre\u002Fconduite",{"label":107,"href":108,"external":69},"Charte plateforme","\u002Fsynedre\u002Fcharte",{"title":110,"links":111},"Ressources",[112,115,118,121,124,127],{"label":113,"href":114,"external":69},"Blog","\u002Fblog",{"label":116,"href":117,"external":69},"Academy","\u002Facademy",{"label":119,"href":120,"external":69},"Dictionnaire","\u002Fdictionnaire",{"label":122,"href":123,"external":69},"Expertise PrestaShop","\u002Fexpertise",{"label":125,"href":126,"external":69},"Flywheel","\u002Fflywheel",{"label":128,"href":129,"external":69},"Manifeste","\u002Fmanifeste",{"title":131,"links":132},"À propos",[133,136,139],{"label":134,"href":135,"external":69},"Alexandre Carette","\u002Fa-propos",{"label":137,"href":138,"external":69},"Dossier de presse","\u002Fpresse",{"label":140,"href":141,"external":69},"Contact","\u002Fcontact",{"items":143},[144,153,159,165,173,181,187,192],{"id":145,"type":146,"label":147,"href":123,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":150,"children":151,"psChildren":152},41,"link",{"fr":148},"Expertise",null,0,[],[],{"id":154,"type":146,"label":155,"href":114,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":156,"children":157,"psChildren":158},42,{"fr":113},1,[],[],{"id":160,"type":146,"label":161,"href":75,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":162,"children":163,"psChildren":164},43,{"fr":74},2,[],[],{"id":166,"type":146,"label":167,"href":169,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":170,"children":171,"psChildren":172},44,{"fr":168},"Outils IA","\u002Foutils-ia",3,[],[],{"id":174,"type":146,"label":175,"href":68,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":177,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":178,"children":179,"psChildren":180},45,{"fr":176},"Offre Starter ✨",{"highlight":20},4,[],[],{"id":182,"type":146,"label":183,"href":117,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":184,"children":185,"psChildren":186},46,{"fr":116},5,[],[],{"id":188,"type":146,"label":189,"href":135,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":57,"children":190,"psChildren":191},47,{"fr":131},[],[],{"id":193,"type":146,"label":194,"href":141,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":195,"children":196,"psChildren":197},48,{"fr":140},7,[],[],{"header":199},{"logo":200,"topBar":205,"contactEmail":208,"features":209,"navBar":149},{"src":201,"alt":202,"text":134,"href":203,"class":204},"\u002Flogo-ac.svg","Alexandre Carette — Architecte E-commerce Souverain","\u002F","h-10 w-10",{"message":149,"showLanguages":69,"align":206,"languages":207},"left",[],"contact@alexandrecarette.fr",{"showSearch":69,"showWishlist":69,"showLogin":20,"showContact":69,"showCart":69,"stickyHeader":20,"headerLayout":210},"inline",{"academy":212,"blog":213,"expertise":224},[],[214,218,221],{"title":215,"url":216,"score":156,"type":217},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back","blog",{"title":219,"url":220,"score":156,"type":217},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":222,"url":223,"score":156,"type":217},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[],{"footer":226},{"theme":227,"description":149,"hours":149,"logo":228,"contact":229,"social":230,"bottomBar":240},"dark",{"src":201,"href":203,"alt":134},{"email":149,"phone":149,"address":149,"cta":149},[231,234,237],{"platform":232,"href":233,"label":232},"linkedin","https:\u002F\u002Fwww.linkedin.com\u002Fin\u002Falexandre-carette\u002F",{"platform":235,"href":236,"label":235},"malt","https:\u002F\u002Fwww.malt.fr\u002Fprofile\u002Falexandrecarette",{"platform":238,"href":239,"label":238},"github","https:\u002F\u002Fgithub.com\u002Fprest4cafe",{"copyright":149}]