[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"theme-db":3,"$fU4BSstyGrg0SCnS84uz67Ku2rbey6G9ARZQgTh9cHs4":22,"$fKnz2vuX4bZz1LbUTiuFsvSZ3e07l5_5fqNYp4Tzdhi8":61,"megamenu":142,"$fX-ub_jcIIQuvkEbPSjp_KWyVkomknXfYhTV5K3eqEZM":198,"header-db":212,"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},"Conflit d'overrides PrestaShop : installer un module malgré une surcharge existante","conflit-overrides-prestashop-installer-module-surcharge-existante","Résolvez l'erreur « méthode déjà surchargée » lors de l'installation d'un module PrestaShop. Fusion manuelle des overrides, étapes et bonnes pratiques.","developpement",[28,29,30,31,32,33],"override","module","conflit","installation","AdminOrdersController","surcharge","intermediaire",[36,37,38],"1.6","1.7","8.x","\u003Ch2>Comprendre le système d'overrides PrestaShop\u003C\u002Fh2>\n\u003Cp>Le mécanisme d'override est l'un des piliers de la personnalisation PrestaShop. Il permet de modifier le comportement d'une classe ou d'un contrôleur du cœur sans toucher aux fichiers originaux. Chaque override se place dans le dossier \u003Ccode>\u002Foverride\u002F\u003C\u002Fcode> et étend la classe parente.\u003C\u002Fp>\n\u003Cp>Le problème survient lorsque \u003Cstrong>deux modules tentent de surcharger la même méthode\u003C\u002Fstrong> d'une même classe. PrestaShop ne sait pas fusionner automatiquement deux overrides concurrents et bloque l'installation avec un message du type :\u003C\u002Fp>\n\u003Cblockquote>\u003Cp>Impossible d'installer la surcharge : La méthode \u003Ccode>__construct\u003C\u002Fcode> dans la classe \u003Ccode>AdminOrdersController\u003C\u002Fcode> est déjà surchargée.\u003C\u002Fp>\u003C\u002Fblockquote>\n\u003Cp>Cette erreur est parfaitement normale : c'est un garde-fou qui empêche un module d'écraser silencieusement les modifications d'un autre.\u003C\u002Fp>\n\u003Ch2>Pourquoi ce conflit se produit\u003C\u002Fh2>\n\u003Cp>Quand un module s'installe, PrestaShop exécute la méthode \u003Ccode>installOverrides()\u003C\u002Fcode>. Cette méthode parcourt le dossier \u003Ccode>override\u002F\u003C\u002Fcode> du module et tente d'injecter chaque méthode dans le fichier d'override global correspondant (\u003Ccode>\u002Foverride\u002Fcontrollers\u002Fadmin\u002FAdminOrdersController.php\u003C\u002Fcode> par exemple).\u003C\u002Fp>\n\u003Cp>Si la méthode existe déjà dans le fichier d'override global — placée là par un autre module ou manuellement — l'installation est refusée.\u003C\u002Fp>\n\u003Cp>Le fichier clé à examiner est :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-\">\n\u002Foverride\u002Fcontrollers\u002Fadmin\u002FAdminOrdersController.php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Ouvrez-le : vous y trouverez la méthode \u003Ccode>__construct()\u003C\u002Fcode> déjà présente, injectée par un module précédemment installé.\u003C\u002Fp>\n\u003Ch2>Solution : la fusion manuelle des overrides\u003C\u002Fh2>\n\u003Cp>La fusion manuelle est la méthode la plus fiable et ne nécessite aucun module tiers. Voici la procédure complète.\u003C\u002Fp>\n\u003Ch3>Étape 1 — Identifier les deux versions du code\u003C\u002Fh3>\n\u003Cp>Récupérez le contenu de la méthode conflictuelle depuis deux sources :\u003C\u002Fp>\n\u003Col>\n\u003Cli>**L'override existant** : `\u002Foverride\u002Fcontrollers\u002Fadmin\u002FAdminOrdersController.php`\u003C\u002Fli>\n\u003Cli>**L'override du nouveau module** : `\u002Fmodules\u002Fnom_du_module\u002Foverride\u002Fcontrollers\u002Fadmin\u002FAdminOrdersController.php`\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Étape 2 — Fusionner le code\u003C\u002Fh3>\n\u003Cp>Créez une version unifiée de la méthode qui intègre la logique des deux modules. Voici un exemple concret avec \u003Ccode>__construct()\u003C\u002Fcode> :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n&lt;?php\n\u002F**\n * Override fusionné — AdminOrdersController\n * Module A + Module B\n *\u002F\nclass AdminOrdersController extends AdminOrdersControllerCore\n{\n    public function __construct()\n    {\n        \u002F\u002F Code du Module A\n        $this-&gt;bootstrap = true;\n        \u002F\u002F ... logique spécifique au module A ...\n\n        \u002F\u002F Code du Module B\n        \u002F\u002F ... logique spécifique au module B ...\n\n        \u002F\u002F Appel au constructeur parent (toujours en dernier)\n        parent::__construct();\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>Point critique\u003C\u002Fstrong> : l'appel à \u003Ccode>parent::__construct()\u003C\u002Fcode> doit généralement rester en dernière position, sauf si l'un des modules attend explicitement qu'il soit appelé avant. Lisez attentivement le code de chaque module pour comprendre l'ordre attendu.\u003C\u002Fp>\n\u003Ch3>Étape 3 — Supprimer l'override du module avant installation\u003C\u002Fh3>\n\u003Cp>Une fois la fusion effectuée dans le fichier global, supprimez ou renommez le fichier d'override dans le dossier du nouveau module :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">\nmv modules\u002Fnom_du_module\u002Foverride\u002Fcontrollers\u002Fadmin\u002FAdminOrdersController.php \\\n   modules\u002Fnom_du_module\u002Foverride\u002Fcontrollers\u002Fadmin\u002FAdminOrdersController.php.bak\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Relancez ensuite l'installation du module depuis le back-office. Sans fichier d'override à injecter, le conflit disparaît.\u003C\u002Fp>\n\u003Ch3>Étape 4 — Vider le cache\u003C\u002Fh3>\n\u003Cp>Après toute modification d'override, videz impérativement le cache :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">\n# Supprimer le fichier de cache des classes\nrm -f var\u002Fcache\u002Fprod\u002Fclass_index.php\nrm -f var\u002Fcache\u002Fdev\u002Fclass_index.php\n\n# PrestaShop 1.6\nrm -f cache\u002Fclass_index.php\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Sur PrestaShop 8.x, vous pouvez également vider le cache Symfony :\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">\nphp bin\u002Fconsole cache:clear --env=prod\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Approche alternative sur PrestaShop 8.x : les hooks plutôt que les overrides\u003C\u002Fh2>\n\u003Cp>Depuis PrestaShop 1.7.7 et surtout sur la version 8.x, Symfony a profondément changé la donne. Les overrides de contrôleurs admin sont \u003Cstrong>dépréciés\u003C\u002Fstrong> au profit de mécanismes plus propres :\u003C\u002Fp>\n\u003Cul>\n\u003Cli>**Hooks** : `actionAdminOrdersControllerBefore`, `actionObjectOrderUpdateAfter`, etc.\u003C\u002Fli>\n\u003Cli>**Décorateurs de services Symfony** : pour modifier le comportement d'un service sans toucher à la classe.\u003C\u002Fli>\n\u003Cli>**Event subscribers** : pour réagir aux événements du cycle de vie.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Si vous développez un module neuf, privilégiez systématiquement les hooks. Les overrides restent fonctionnels mais constituent une dette technique croissante.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-php\">\n\u002F\u002F Exemple : hook moderne remplaçant un override de __construct\npublic function hookActionAdminControllerSetMedia()\n{\n    if ($this-&gt;context-&gt;controller instanceof AdminOrdersController) {\n        \u002F\u002F Votre logique ici, sans override\n        $this-&gt;context-&gt;controller-&gt;addCSS($this-&gt;getPathUri() . 'views\u002Fcss\u002Fcustom.css');\n    }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Bonnes pratiques pour éviter les conflits d'overrides\u003C\u002Fh2>\n\u003Col>\n\u003Cli>**Documentez vos overrides** : ajoutez un commentaire en tête de chaque méthode surchargée indiquant quel module l'a posée et pourquoi.\u003C\u002Fli>\n\u003Cli>**Avant d'installer un module**, inspectez son dossier `override\u002F` pour anticiper les conflits.\u003C\u002Fli>\n\u003Cli>**Tenez un registre** des overrides actifs sur votre boutique. Un simple fichier texte listant module → classe → méthode vous évitera bien des surprises.\u003C\u002Fli>\n\u003Cli>**Préférez les hooks** quand c'est possible : ils sont cumulables par nature, contrairement aux overrides.\u003C\u002Fli>\n\u003Cli>**Sauvegardez** toujours le fichier d'override global avant de le modifier.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Cas particulier : désinstallation d'un module après fusion\u003C\u002Fh2>\n\u003Cp>Attention : si vous désinstallez un module dont l'override a été fusionné manuellement, PrestaShop tentera de retirer ses méthodes du fichier d'override global via \u003Ccode>uninstallOverrides()\u003C\u002Fcode>. Comme vous avez modifié ce fichier manuellement, la désinstallation pourrait échouer ou laisser du code orphelin.\u003C\u002Fp>\n\u003Cp>Dans ce cas, nettoyez manuellement le fichier d'override après désinstallation et videz le cache.\u003C\u002Fp>",[41,44,47,50,53],{"q":42,"a":43},"Comment savoir quel module a posé un override existant sur PrestaShop ?","Consultez la table `ps_module` en base de données et croisez avec le contenu du dossier `\u002Foverride\u002F`. Vous pouvez aussi chercher dans chaque module installé (`\u002Fmodules\u002F*\u002Foverride\u002F`) le fichier correspondant. Sur PrestaShop 1.7+ et 8.x, le fichier `app\u002Fconfig\u002Fclass_index.php` (ou `var\u002Fcache\u002F*\u002Fclass_index.php`) liste les overrides actifs avec leur chemin d'origine.",{"q":45,"a":46},"Peut-on fusionner automatiquement les overrides PrestaShop sans module tiers ?","Non, PrestaShop ne propose pas de mécanisme natif de fusion automatique. La fusion doit être réalisée manuellement en combinant le code des deux méthodes conflictuelles dans le fichier d'override global. C'est un travail ponctuel qui demande de comprendre la logique de chaque module pour respecter l'ordre d'exécution et éviter les effets de bord.",{"q":48,"a":49},"Les overrides fonctionnent-ils encore sur PrestaShop 8.x ?","Oui, les overrides de classes et de contrôleurs front-office restent fonctionnels sur PrestaShop 8.x. En revanche, les overrides de contrôleurs admin Symfony (ceux migrés vers le nouveau back-office) ne sont plus supportés. Pour ces contrôleurs, utilisez les hooks, les décorateurs de services ou les event subscribers Symfony.",{"q":51,"a":52},"Faut-il vider le cache après avoir modifié un override PrestaShop ?","Oui, impérativement. PrestaShop met en cache la liste des overrides dans le fichier `class_index.php`. Si vous ne videz pas ce cache après modification, vos changements seront ignorés. Supprimez le fichier `class_index.php` dans le dossier de cache ou utilisez la commande `php bin\u002Fconsole cache:clear` sur PrestaShop 8.x.",{"q":54,"a":55},"Que se passe-t-il si je modifie directement les fichiers du cœur PrestaShop au lieu d'utiliser un override ?","Modifier les fichiers du cœur est fortement déconseillé. Toute mise à jour de PrestaShop écrasera vos modifications sans préavis. Le système d'override existe précisément pour éviter ce problème : il permet de personnaliser le comportement tout en préservant la capacité de mise à jour. Sur PrestaShop 8.x, les hooks et les services Symfony offrent des alternatives encore plus robustes.","Quand un module refuse de s'installer à cause d'un override déjà existant, la solution est de fusionner manuellement les deux versions de la méthode conflictuelle dans le fichier d'override global, puis de supprimer l'override du module avant de relancer l'installation.",4,"2026-03-21T15:28:11.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,180,186,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":57,"children":178,"psChildren":179},45,{"fr":176},"Offre Starter ✨",{"highlight":20},[],[],{"id":181,"type":146,"label":182,"href":117,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":183,"children":184,"psChildren":185},46,{"fr":116},5,[],[],{"id":187,"type":146,"label":188,"href":135,"icon":149,"description":149,"badge":149,"groupTitle":149,"style":149,"gridColumns":149,"cssClass":149,"psCategoryId":149,"showPsChildren":69,"position":189,"children":190,"psChildren":191},47,{"fr":131},6,[],[],{"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,[],[],{"academy":199,"blog":200,"expertise":211},[],[201,205,208],{"title":202,"url":203,"score":156,"type":204},"PrestaShop headless avec Nuxt 3 : pourquoi séparer back et front","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-separation-front-back","blog",{"title":206,"url":207,"score":156,"type":204},"PrestaShop headless : Nuxt 3, pas Next.js — le choix souverain","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fprestashop-headless-nuxt-nextjs-souverainete",{"title":209,"url":210,"score":156,"type":204},"Sylius rachète PrestaShop : ce que ça change pour vous","\u002Fblog\u002Fprestashop\u002Farchitecture\u002Fsylius-rachat-prestashop-headless-souverainete",[],{"header":213},{"logo":214,"topBar":219,"contactEmail":222,"features":223,"navBar":149},{"src":215,"alt":216,"text":134,"href":217,"class":218},"\u002Flogo-ac.svg","Alexandre Carette — Architecte E-commerce Souverain","\u002F","h-10 w-10",{"message":149,"showLanguages":69,"align":220,"languages":221},"left",[],"contact@alexandrecarette.fr",{"showSearch":69,"showWishlist":69,"showLogin":20,"showContact":69,"showCart":69,"stickyHeader":20,"headerLayout":224},"inline",{"footer":226},{"theme":227,"description":149,"hours":149,"logo":228,"contact":229,"social":230,"bottomBar":240},"dark",{"src":215,"href":217,"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}]