Override / Surcharge PrestaShop 1.407Sep.2012

Les bonnes pratiques PrestaShop : L’override

Pendant longtemps, les intégrateurs PrestaShop usaient de sombres stratagèmes lorsqu’ils souhaitaient modifier les fonctionnalités natives de PrestaShop. Le moindre petit écart du fonctionnement d’origine amenait à modifier les fichiers du coeur de la solution (aussi appelés core).
Heureusement ce temps est révolu depuis la version 1.4 ! Cependant, la version 1.5 pointe le bout de son nez et encore trop nombreux sont ceux qui n’utilisent pas l’override (ou surcharge pour les anglophobes).

Définition et fonctionnement

Que nous dit Google Traduction ?
« Override » peut être traduit par : « outrepasser », « ne pas tenir compte »… et c’est exactement ça, le principe.
En gros, on duplique un fichier que l’on veut modifier dans un répertoire précis, et PrestaShop l’utilise, sans tenir compte des fichiers d’origine.

Euh… et c’est pas plus chiant embêtant que de modifier directement le fichier concerné ?

C’est un peu plus long à mettre en place au début, voir casse-tête quand les modules ne sont pas bien conçus. Mais ça évite pas mal de problèmes par la suite.

Tout d’abord il faut considérer que si l’on veux modifier l’affichage d’un module, c’est pour qu’il colle à notre thème personnalisé. Alors imaginons que vous modifiez le fichier d’origine de votre module pour qu’il s’adapte parfaitement à votre thème.
Puis, quelques temps après, vous voulez changer de thème… et là, problème ! Le nouveau thème n’est pas du tout prévu pour le fonctionnement modifié du module !
L’override permet de conserver les modifications d’un module à l’intérieur d’un thème, et de le suivre. Ainsi si vous déplacer votre thème, les overrides que vous lui aurez appliqués seront également appliqués à la nouvelle boutique.

L’autre problème survient lors de la mise à jour de la boutique. Si vous avez modifier les fichiers du cœur de PrestaShop, lors d’une mise à jour de la plateforme, vous êtes bon pour vous retaper toutes les modifs fichier par fichier.
Alors que si vos modifications sont dans votre thème, aucun soucis, puisque le thème, lui, n’est pas mis à jour avec la plateforme.

Woaw, génial ! Et ça marche avec tous les fichiers !?

Non, pas tout à fait.
La version 1.4 de PrestaShop permet d’overrider les fichiers css, js et tpl des modules correctement conçus, ainsi que les classes et controllers d’origines PrestaShop.

Override des modules

Globalement, on trouve dans le répertoire d’un module les fichiers js, css et tpl suivants :

  • /modules/mon_module/mon_module.tpl
  • /modules/mon_module/mon_module.css
  • /modules/mon_module/mon_module.js

Pour changer l’affichage de ce module, vous devez créer les fichiers suivants :

  • /themes/mon_theme/modules/mon_module/mon_module.tpl
  • /themes/mon_theme/css/modules/mon_module/mon_module.css
  • /themes/mon_theme/js/modules/mon_module/mon_module.js

Lorsque le module sera chargé en front-office, ses fichiers seront utilisés à la place des originaux.

Override des classes et controllers

PrestaShop à pensé à tout (ou presque) en permettant l’override de ses classes et controllers.
Ainsi, si vous souhaitez modifier le fonctionnement d’une des méthodes d’origine, il vous suffit de dupliquer le fichier de classe ou le controller dans le dossier override/classes ou override/controllers.

Exemple

Pour une raison ou une autre, l’on souhaite modifier la fonction Product::getProductProperties().
Cette fonction se trouve dans le fichier /classes/Product.php, dans la class ProductCore.

Pour modifier cette fonction proprement, il faut créer le fichier /override/classes/Product.php, et y insérer la classe Product, extension de sa classe mère ProductCore (présente dans le fichier d’origine).

J’en ai perdu quelques-uns là… Non ? Alors on continue !

En bref, votre fichier /override/classes/Product.php doit contenir ceci :

<?php
class Product extends ProductCore{
public static function getProductProperties($id_lang, $row){
// ici vos modifications
}
}
?>

Ainsi, dès que PrestaShop fera appel à la fonction Product::getProductProperties(), il appellera celle que vous avez modifié.
Vous pouvez également vous servir de cette technique pour rajouter de nouvelles fonctions à des classes existantes.

Limites

S’il n’y avait pas de limites ça serait trop beau !

Premièrement, et comme je l’ai dis plus haut, seuls les fichiers js, css et tpl sont surchargeable pour les modules. Il vous est donc impossible de modifier le fonctionnement d’un module aussi bien conçu soit-il sans modifier son code PHP (sauf s’il n’utilise que des classes d’origine PrestaShop).

Votre boutique peut être mise à jour, OUI MAIS il est possible que les fichiers de classes ou controllers changent d’une version à l’autre de PrestaShop (ce qui est souvent le cas pour les mises à jour de sécurité), et donc votre override conservera peut-être des failles potentielles qui seront utilisées à la place d’un fichier corrigé… eh oui !

Conclusion

L’override est une invention astucieuse qui a été relativement bien implémentée dans PrestaShop alors pourquoi s’en priver ?
Gardez cependant à l’esprit que cette méthode possède ces propres limites et qu’il n’est pas impossible de tout de même devoir toucher au corps core de PrestaShop.

Dans tous les cas il st toujours conseillé de faire appel à une agence web qui maîtrise l’intégration d’un template Prestashop avec une bonne connaissance et maîtrise de la surcharge pour vous éviter de nombreuse surprises dans l’évolution de votre boutique en ligne !

Il y a 42 commentaires

  • Antoine

    Bonjour, et merci pour cet article qui m'a en partie permis d'arriver à ce que je voulais.

    Il subsiste toutefois un problème:
    Dès que le cache est effacé et recréé, mes modifications sont perdues (le fichier cache/class_index.php est reconstruit et le path vers mon override est remis à '' (vide)

    Auriez-vous une direction à m'indiquer vers laquelle chercher ?

    Merci d'avance.

    • Guillaume Heid

      Bonjour Antoine,

      C'est malheureusement une réaction qui m'est inconnue.
      Le fichier class_index doit bien être re-générer lors du vidage du cache, mais il devrait détecter la présence de fichiers surchargés et en conserver le chemin.

      Si vous avez bien suivi la procédure, il se peut que le problème vienne d'ailleurs, et là, tout est possible ^^'
      Je vous conseille alors de rechercher du côté des fonctions de reconstruction du fichier. Elles doivent effectuer des tests pour compléter ou non ce chemin… Peut-être que cela vous permettra de trouver d'où vient le problème.

      Bon courage 😉

      • Antoine

        Bonjour, et merci pour votre réponse rapide.

        Je suis un newbie sur Prestashop …
        Où sont les fonctions de reconstruction de class_index.php .

        Merci d'avance.

  • Mthiebault

    Bonjour merci pour votre article très intéressant. Je suis novice en prestashop et je trouvais ce procédé fort sympathique. Par contre je trouve que c'est une fausse solution. En effet j'ai mis en place un prestashop avec peu de module et je suis déjà limiter par deux modules. J'ai mis un module private shop qui securise le prestashop a certains customer. ce module evidement fait un overide du controller authcontroller pour le login. Du coup je souhaite aussi mettre un captcha sur la page de login avec le module recaptcha et voila que je suis bloque car j'ai besoin d'acceder a ce systeme d'authentification pour ajouter le test du captcha!! On ne sait pas overrider un controller qui a déjà ete overrider par un autre module si je comprends bien ? Du coup je sais pas comment faire? Je trouve donc ca une sorte de solution egoiste dans le sens ou on fait un override sans se soucier des autres modules. Et donc on est pas libre de pouvoir overrider un controller si il a deja ete overider par un autre module !

    • Guillaume Heid

      Bonjour,

      Je peux comprendre votre désarrois face à ce type de problématique.
      A l'heure actuelle, PrestaShop est d'ors et déjà capable d'une grande autonomie dans la gestion des overrides, mais il subsiste encore certains cas de figure où l'intervention humaine d'un développeur reste nécessaire (heureusement, sinon nous nous retrouverions très vite au chômage ^^).

      En effet, Lors de l'installation d'un module, si son développeur a bien fait les choses, PS est en mesure de détecter si un override est nécessaire. Si c'est le cas, il va tenter de créer cet override si le fichier PHP en question n'existe pas encore.
      PS va même au-delà de cette limite, en tentant de fusionner le nouvel override avec l'existant, dans la limite où les deux fichiers ne contiennent pas de fonctions (méthodes) communes.

      Si des fonctions communes sont rencontrées, PS stoppe le processus, et vous indique que l'installation du module a échouée.
      Dans ce cas, mieux vaut rester prudent, et fusionner les deux fichiers manuellement avant de retenter l'installation du module.
      Seule la conscience du développeur pourra lui permettre de fusionner proprement les deux fonctions pour faire cohabiter les différentes fonctionnalités.

      J'espère que cela sera plus clair pour vous 😉

      • mthiebault

        Bonjour, Merci pour votre réponse!
        Justement cette partie de fusionner le code, que le développeur peut faire lui même, c'est sur cette partie que je ne comprends pas trop.
        Dans mon cas j'ai un module privateshop qui override Authcontroller et j'ai aussi un module de captcha qui doit overrider AuthController, bien sur quand j'upload ce module captcha j'ai l'erreur de pretssahop comme vous l'avez expliqué précédement, ca je comprends bien d'ou la limitation de cette technique override. Par contre, si je comprends bien je dois faire moi même l'override des deux codes je suppose dans le fichier Authcontroller du dossier override de prestsahop mais commen après je dois faire pour installer le module captcha ? je refais une install et il ne fera plus l'erreur ?

        • Guillaume Heid

          Si mes souvenirs sont bons, vous pouvez procéder ainsi oui.
          Si cela ne fonctionne pas, vous pouvez aussi renommer le dossier "override" du module en question en "_override" par exemple. Ainsi PrestaShop ne le détectera pas et ne tentera pas de faire l'override lui-même lors de l'installation.

  • Seffrig

    Bonjour,

    J'utilise Prestashop 1.6.0.14 et j'essaye d'override la classe Product. donc je fais comme dans votre exemple:
    class Product extends ProductCore
    {
    pubic $newVar =false;
    }
    Toutefois j'ai u message d'erreur. Classe ProductCore undefinied. Est ce que vous savez d'ou peut venir ce problème?

    • Guillaume Heid

      Bonjour Seffrig,

      Je constate au moins une erreur dans le code indiqué : "public" et non "pubic". Le reste semble cohérent.
      Avez-vous réinitialiser le cache de PrestaShop ? Car celui-ci stock les chemins vers les fichiers d'override, il est donc possible qu'il ne prenne pas en compte certains de vos fichiers.

      Bonne chance dans vos recherches 😉

      • Seffrig

        La faute est une légère faute de frappe (j'utilise un clavier un peu capricieux ^^)
        Oui j'ai déjà vider le cache sans succès.
        Merci je vais continuer à chercher ca doit être une erreur d'étourderie.

  • Larry

    Bonjour,
    Je suis novice sous Prestashop et je suis en train d'implémenter mon premier module.
    J'ai lu les docs relatives à l'override mais je ne parviens pas à trouve une solution à ma problématique :
    Je crée un module MonModule et je voudrais lors de l'installation de MonModule il y ait un override du fichier "shop\themes\default-bootstrap\js\modules\blockcart\ajax-cart.js" (je souhaite overrider une fonction de ce fichier js).
    Comment dois je procéder pour overrider le fichier js "shop\themes\default-bootstrap\js\modules\blockcart\ajax-cart.js" qui si j'ai bien compris est déjà lui meme un override de "shop\modules\blockcart\ajax-cart.js" ?

    Je ne sais meme pas si c'est la bonne approche à avoir dans mon cas, sinon pourriez vous m'indiquer ce qu'il faudrait faire ?

    Merci

    • Larry

      Je précise etre sous Presta 1.6.0.11

    • Guillaume Heid

      Bonjour Larry,

      En effet, je pense que vous prenez la mauvaise direction car le fichier dont vous parlez est effectivement déjà un override.

      Dans votre cas précisément, je pense qu'il faudrait plutôt vous affairer à créer un script JS qui "annulerait" le comportement du ajax-cart.js et le remplacerait par le comportement souhaité.

      Il est cependant délicat d'en dire d'avantage, et cela semble déjà bien poussé pour un premier module ^^

      Une alternative, si vous utilisez un thème "custom", serait de reprendre l'override du fichier ajax-cart.js, et de l'adapter à votre besoin. Mais on perd alors la notion de "module"… je ne sais pas si c'est important pour vous ou non.

      Bonne chance dans votre démarche 😉

      • Larry

        Merci pour votre réponse

        En fait le but est de créer un module qui fasse une installation et désinstallation "propre" sans avoir à toucher si possible aux autres fichiers sur le serveur web
        Il est vrai que la solution du theme custom n'est pas vraiment le genre de solution que j'envisage
        Pensez-vous qu'il serait possible de faire cela de façon "propre" meme si cela demande plus de choses à mettre en oeuvre ?
        Pourquoi est-ce délicat d'en dire plus ? ^^

      • Guillaume Heid

        Bonjour Larry,

        C'est "délicat d'en dire plus" car je ne sais pas exactement ce que vous souhaitez faire, mise à part la création d'un module pour pouvoir ajouter et supprimer vos modifications proprement ^^

        Le vrai problème est effectivement que le fichier qui vous intéresse est déjà "surchargé" par le thème d'origine. Plusieurs solutions s'offrent alors à vous.

        1. Reprendre le module blockcart au complet en effetuant vos modifications comme souhaité, et bien indiquer aux utilisateurs que votre module "remplace" le module natif.

        2. Faire en sorte de "surcharger" le fichier ajax-cart.js sans tenir compte du thème de base de PrestaShop. En effet, la plupart des utilisateurs n'utilisent pas le thème natif une fois leur boutique en production.

        3. Se lancer dans le matching de fichiers en PHP, mais là ça risque de vite devenir compliqué…
        Si ce fichier existe alors je le backup, et je le remplace, à la désinstallation de mon module je le restaure… mais s'il n'existe pas alors…

        Bref… comme toujours en PHP, il y a plusieurs solutions pour arriver à un résultat similaire. La première selon moi étant sans doute la plus claire.

        Bonne chance 😉

      • Larry

        Bonjour,

        Je vous remercie pour toutes ces informations

        Cdt

  • Stonerockmedia

    je souhaite modifier l'affichage du product-list.tpl de la page d'accueil.
    Je compte exploiter l'override mais je suis débutant.
    j'ai fait un test avec une variable type qui permet d'afficher le supplier à côté du produit.Elle fonctionne sur la fiche produit product.tpl.
    Par contre c'est le néant sur la page d'accueil.J'ai fait un test tout simple en insérant du contenu statique type ´dupont´ associé au nom du produit.
    Techniquement c'est sans intérêt mais c'était pour confirmer si le problème est lié à la variable correspondante.
    Je pense que les données correspondantes à supplier ne sont pas chargées sur product-list.tpl.
    Pouvez-vous m'aider svp
    cordialement

    • Guillaume Heid

      Bonjour,

      En effet, il faut avoir conscience que les variables SMARTY diffèrent selon la page courante, vos overrides et la version de PrestaShop utilisée.

      Pour connaître les variables disponibles à l'endroit souhaité, vous devez afficher le debug SMARTY : {debug}. Une fenêtre vous indiquera la liste de toutes les variables disponibles.

      Si vous ne trouvez pas les informations que vous voulez, il est certainement nécessaire de faire quelques modifications dans le code PHP de votre boutique… le forum PrestaShop sera alors certainement plus à même de vous répondre sur ce point 😉

  • Lenwë

    Salut

    Une info que je cherche depuis un moment c'est comment overrider un thème ? Concrètement, je veux pouvoir effectuer quelques modifications dans le thème par défaut default-bootstrap sans le modifier ni le dupliquer (beurk) mais dans un thème séparé, un peu comme les thèmes enfant dans WordPress.

    Je n'arrive pas à trouver d'info là dessus. Quant au forum officiel, les membres ont l'air d'être de vrais boulets… (cf http://www.prestashop.com/forums/topic/264461-resolu-peut-on-creer-un-theme-enfantchild-theme-avec-prestashop/ )

    • Guillaume Heid

      Bonjour Lenwë,

      Je ne crois pas que ce soit possible à ma connaissance, à moins que je ne saisisse pas bien votre demande. Je pense que c'est pour cette raison que vous ne trouvez pas d'infos à ce sujet…

      A mon avis, le plus propre est encore de dupliquer entièrement le thème en question et d'y apporter vos modifications.

      Je vous souhaite bonne chance 😉

      • Lenwë

        C'est bien ce qui me semblait. Je trouve ça tout de même un peu absurde étant donné qu'on puisse surcharger tout et n'importe quoi et ce de façon très propre sauf les thèmes. Ceci rend surtout les mises à jour pénibles car les éventuelles corrections appliquées au thème bootstrap-default ne seront pas répercutées dans mon thème modifié, à moins de réinjecter le diff.

    • Guillaume Heid

      C'est discutable comme beaucoup d'autres choses sur cette solution, je vous l'accorde.
      Mais override sur override sur override… il faut bien s'arrêter quelque part… En tout cas ceci ne nous a jamais posé de problèmes jusque là.

      😉

  • Vincent

    Bonjour,

    Est il possible de faire un override d ‘un fichier situé ici :
    www/MONDOSSIERADMIN/themes/default/template/controllers/products/information.tpl
    et si oui ou le mettre? j’ai fait plusieurs essais.. sans succés.

    Merci

    • Vincent

      C’est résolu.
      j’avais pas supprimé le class_index.php 😉

      • Alex

        Merci ! Je ne comprenais pas pourquoi l'override ne fonctionnait pas, mais après la suppression du fichier "/cache/class_index.php" ça marche nickel 🙂

  • alamedagraphik

    Bonjour,
    je viens de voir votre article, et il est bien pratique. en effet si on regarde le thème default de prestashop l’override des modules est important. Par contre, parfois l’override ne fonctionne pas. je suis actuellement sur un projet prestashop sur serveur dédié et mon problème est lié au fait que le moteur ne veut pas faire d’override des fichiers css ou tpl des modules de mon thème. Pourquoi, je ne sais pas ?!

    • Guillaume Heid

      Bonjour Alameda,

      Généralement il faut bien faire attention a respoecter la même arborescence dans votre thème que dans le module.
      Il se peut aussi que le module ai été mal conçu, et que l’override devienne impossible. Je suis déjà tombé sur le cas d’un module édité par PrestaShop eux-même :s

      • alamedagraphik

        Pourtant je n’ai fait que dupliquer le thème par default. et meme sur ce thème l’override ne fonctionne pas!

    • Guillaume Heid

      Le problème ne vient généralement pas du thème utilisé, mais bien des modules.
      Il faut aussi penser à forcer la compilation SMARTY pour visualiser les modifications que l’on fait sur les TPL.
      L’override de PrestaShop reste une opération « technique » pouvant poser problèmes à certains.
      Mais généralement ça marche plutôt bien 😉

  • larabdj

    Merci infiniment Guillaume pour cet article qui m’a clarifier plein de chose à propos de l’override car j’ai souvent parler de cette invention et je ne le connaissais pas suffisamment. Je suis ravi de pouvoir posté sur votre blog. Amicalement.

  • isabelle.marzin87

    C’est vraiment l’outil dont j’ai besoin et que je cherche depuis quelques jours. On m’a souvent parlé de l’override et de ces bienfaits et là je réalise à quel point il est indispensable pour les développeurs. Salutations.

  • Hervé Zarka

    Je pense que tous les développeurs sous Prestashop sont censés tôt ou tard se servir de l’override. Ce concept, permettant de surcharger les fichiers, est très simple à comprendre mais il demande de la pratique. Merci.

    • Guillaume Heid

      Bonjour Hervé et bienvenue sur notre blog !

      L’override de PrestaShop est effectivement une technique indispensable à tout développeur qui se respecte, car elle permet de travailler plus rapidement et plus proprement.

      😉

  • pierre.louisbole73

    L’override permet une simplification de la modification et qui m’est vraiment très utile dans mes devs Prestashop. Merci Guillaume pour ce très bon article. Cordialement.

    • Guillaume Heid

      Bonjour,

      C’est exactement ça. L’override de PrestaShop permet aussi, dans certaines limites, de ne pas perdre les modifications que l’on lui apporte lors des mises à jours de fichiers… 😉

  • frederic.jezequel79

    Je suis tombé par hasard sur votre article concernant l’override et il m’a vraiment clarifié plein de chose que je ne connaissais pas auparavant autour des bonnes pratiques Prestashop. Merci infiniment pour ce billet de blog. Salutations.

    • Guillaume Heid

      Bonjour,

      C’est avec plaisir que nous partageons ces quelques connaissances, car PrestaShop renferme encore bien d’autres possibilités 😉

      @ bientôt sur notre blog !

  • michelle.autrive80

    Je tiens à vous remercier Guillaume pour cet excellent article les bonnes pratiques PrestaShop car c’est toujours un plaisir de lire des articles très instructifs comme le vôtre. Merci pour le partage et bonne continuation.

    • Guillaume Heid

      Bonjour et bienvenue sur notre blog.

      Nous espérons effectivement rendre nos articles intéressant, mais c’est avant tout un plaisir de partager nos connaissances avec nos lecteurs ! 😉

  • fdevCréation

    Merci pour cet article, bien pratique !

    • Guillaume Heid

      Bonjour fdevCréation, et bienvenue sur notre blog !

      Nous faisons en sorte de soulever des points intéressants sur des choses que nous mettons en place tous les jours 😉

Laisser un commentaire

*