Développement
Modules, hooks, overrides, Symfony, API
61 articles
Ajouter un loader lors de la soumission de commande PrestaShop
Pour ajouter un loader au tunnel de commande PrestaShop, injectez un script JavaScript (protégé par {literal} en Smarty) qui affiche un overlay au submit du formulaire de paiement et désactive le bouton pour éviter les doubles commandes. En PrestaShop 8.x, privilégiez un module avec le hook actionFrontControllerSetMedia.
Créer un select dynamique dans un template Smarty PrestaShop
Pour créer un select dynamique dans un template Smarty PrestaShop, utilisez soit les méthodes statiques natives (comme Supplier::getSuppliers()), soit un ObjectModel personnalisé avec DbQuery, en assignant les données via le controller plutôt que par appel direct dans le .tpl.
Générer un PDF dans un module PrestaShop : guide complet
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.
Activer la navigation à facettes sur la page d'accueil PrestaShop
Le module de navigation à facettes PrestaShop ne fonctionne pas sur la page d'accueil car il nécessite un contexte de catégorie. Deux solutions : rediriger la homepage vers une catégorie via un override d'IndexController, ou créer un module compagnon qui injecte le contexte catégorie et délègue le rendu au module de filtrage.
Fatal error Class FrontController not found dans un module PrestaShop
L'erreur « Class FrontController not found » dans un module PrestaShop est causée par un non-respect de la convention de nommage stricte des contrôleurs front. La classe doit impérativement s'appeler {nomdumodule}{Controleur}ModuleFrontController, sans underscores dans le nom du module, et étendre ModuleFrontController.
Gérer les traductions templates Smarty dans PrestaShop
Pour rendre un texte traduisible dans un template Smarty PrestaShop, utilisez la fonction {l s='Votre texte' mod='nom_module'} au lieu d'écrire le texte en dur. La chaîne devient alors éditable depuis le back-office dans International → Traductions.
Récupérer des variables dans les URLs simplifiées PrestaShop
Les URLs simplifiées PrestaShop reposent sur le Dispatcher qui utilise des expressions régulières pour extraire les identifiants de chaque URL. Pour ajouter des variables personnalisées, privilégiez le hook moduleRoutes dans un module plutôt que des règles .htaccess, afin de garantir la pérennité et la compatibilité avec la génération de liens.
Arrondir un prix en Smarty dans PrestaShop : ceil, round et math
Pour arrondir un prix au centime supérieur en Smarty, utilisez {math equation='ceil(a*100)/100' a=$variable}. En PrestaShop 8.x, préférez Tools::ps_round() côté PHP avec la constante PS_ROUND_UP pour respecter les règles d'arrondi de la boutique.
Override du CategoryController dans PrestaShop : guide complet
Pour overrider le CategoryController dans PrestaShop, créez le fichier override/controllers/front/CategoryController.php avec une classe étendant CategoryControllerCore, puis supprimez le cache class_index.php. Sur PrestaShop 8.x, les hooks de contrôleur sont une alternative plus maintenable.
Ajouter un champ personnalisé aux fiches produits PrestaShop
Pour ajouter un champ personnalisé aux produits PrestaShop, il faut intervenir à quatre niveaux : colonne SQL dans ps_product_lang, override de la classe Product (ObjectModel), intégration au formulaire back-office, et affichage front-office via Smarty. En PS 8.x, préférez un module avec hooks Symfony.
Afficher le fabricant sur les meilleures ventes PrestaShop
Pour afficher le fabricant dans le module meilleures ventes PrestaShop, créez un override de ProductSale::getBestSalesLight() ajoutant un LEFT JOIN sur ps_manufacturer, puis exploitez la variable manufacturer_name dans votre template Smarty.
Créer un champ multilingue dans un AdminController PrestaShop
Pour créer un champ multilingue dans un AdminController PrestaShop, trois éléments sont indispensables : une table `_lang` en base de données avec clé composite, un ObjectModel déclaré avec `'multilang' => true` et `'lang' => true` sur chaque champ traduisible, et le paramètre `'lang' => true` dans la définition du formulaire du contrôleur.
Accéder au code source de la page d'accueil PrestaShop
La page d'accueil PrestaShop est composée de plusieurs fichiers template (header.tpl, index.tpl, footer.tpl) et de modules hookés qui injectent leur propre contenu. Pour modifier un élément, il faut d'abord identifier le fichier responsable via le mode debug Smarty, puis le surcharger proprement dans un thème enfant.
Modifier l'ordre des catégories dans un menu PrestaShop
Pour corriger l'ordre des catégories dans un menu PrestaShop, remplacez `ORDER BY cl.name ASC` par `ORDER BY c.position ASC` dans la requête SQL du module de menu, ou utilisez la méthode native `Category::getChildren()` qui trie par position par défaut.
Ajouter des champs personnalisés au formulaire d'inscription PrestaShop via un module
Pour ajouter des champs au formulaire d'inscription PrestaShop, créez un module utilisant le hook additionalCustomerFormFields plutôt qu'un override de la classe Customer. Cette approche est compatible 1.7 à 8.x, sans conflit entre modules et désinstallable proprement.
Changer l'ordre des champs du formulaire d'adresse PrestaShop
Pour réorganiser les champs du formulaire d'adresse PrestaShop, modifiez le template Smarty (1.6) ou surchargez le CustomerAddressFormatter via un module (1.7/8.x). Pensez impérativement à vider le cache Smarty et à vérifier que vous éditez le bon template dans la hiérarchie de votre thème.
Récupérer les personnalisations produit PrestaShop via ObjectModel
Guide complet pour créer une classe ObjectModel dédiée à la récupération des personnalisations produit PrestaShop, avec requêtes DbQuery par produit et par commande, bonnes pratiques de sécurité SQL et compatibilité 1.7/8.x.
Gérer les traductions vides dans PrestaShop : guide complet
Les traductions vides dans PrestaShop surviennent quand un module ne fournit pas de fichier de langue pour votre boutique. La solution la plus fiable est de dupliquer un fichier de traduction existant, de traduire les chaînes (manuellement ou en masse via tableur), puis de placer le résultat dans le dossier de surcharge du thème pour survivre aux mises à jour.
Intégrer un widget externe dans votre thème PrestaShop
Pour intégrer un widget externe dans PrestaShop, trois méthodes existent : l'édition directe des fichiers TPL du thème (rapide mais fragile), la création d'un module dédié avec hooks (pérenne et professionnel), ou l'utilisation du module HTML personnalisé (sans code). La méthode par module est recommandée pour sa résistance aux mises à jour et sa flexibilité.
Activer le zoom produit au clic plutôt qu'au survol sur PrestaShop
Sur PrestaShop 1.6, le zoom et le changement d'image produit au survol se modifient dans le fichier product.js du thème (ligne ~258) en remplaçant l'événement mouseover par click — sans jamais toucher à la librairie JQZoom. Sur PS 1.7+ et 8.x, le clic est souvent le comportement par défaut.
Conflit d'overrides PrestaShop : installer un module malgré une surcharge existante
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.
Traduire un module PrestaShop attaché à un hook personnalisé
Pour traduire un module PrestaShop sur un hook personnalisé, utilisez la syntaxe `{l s='texte' mod='nom_module'}` dans vos templates Smarty, en veillant à échapper les apostrophes pour éviter les pages blanches, puis gérez les traductions via le back-office dans Localisation → Traductions des modules installés.
Forcer l'ID produit lors de la création dans PrestaShop
Pour forcer un id_product à la création dans PrestaShop, utilisez $product->force_id = true avant add() plutôt que des UPDATE SQL manuels qui oublient des tables et cassent l'intégrité référentielle.
Afficher le nombre de favoris (likes) sur une fiche produit PrestaShop
Pour afficher le nombre de favoris d'un produit PrestaShop, utilisez Db::getInstance()->getValue() avec un COUNT(*) sécurisé par un cast (int), jamais ExecuteS() qui retourne un tableau inutilisable directement dans Smarty.
Gérer les traductions dans les templates Smarty PrestaShop
La balise Smarty `{l}` de PrestaShop ne permet pas d'injecter directement des variables dans le paramètre `s`. Pour inclure des valeurs dynamiques dans vos traductions, utilisez le paramètre `sprintf` avec des placeholders, et gérez toutes vos traductions de manière centralisée via le back-office.
Personnaliser le formulaire de création de compte PrestaShop
Pour personnaliser le formulaire d'inscription PrestaShop, créez un module exploitant le hook `additionalCustomerFormFields` qui injecte des champs via l'API FormField, avec validation serveur et stockage dans une table dédiée — sans jamais modifier le core.
Récupérer l'ID d'une image après insertion en base PrestaShop
Pour récupérer l'ID d'une image après insertion en base PrestaShop, utilisez Db::getInstance()->Insert_ID() juste après l'INSERT. La méthode recommandée reste l'ObjectModel Image qui gère automatiquement l'ID, le multiboutique et le chemin des fichiers.
Requête AJAX onChange dans PrestaShop : select dynamique en cascade
Implémentation complète de selects en cascade avec AJAX dans PrestaShop : contrôleur AJAX avec ajaxRender(), exposition de l'URL via Smarty, et gestion JavaScript avec cache client et feedback visuel. Compatible PrestaShop 1.7 et 8.x.
Afficher un texte dynamique sous le logo selon la page PrestaShop
Pour afficher un headline dynamique sous le logo selon la page visitée, utilisez des conditions Smarty ({if $page.page_name == 'category'}) pour un besoin simple, ou créez un champ personnalisé en base de données pour une solution maintenable et éditable depuis le back-office.
Intégrer un flux de blog externe dans PrestaShop via une page CMS
Pour intégrer un blog externe dans PrestaShop, créez une page CMS dédiée et utilisez une condition Smarty dans le template pour injecter le contenu uniquement sur cette page. Attention au paramètre de déplacement JavaScript en fin de page qui peut bloquer le widget. En PrestaShop 8.x, préférez un module consommant l'API du blog pour un rendu côté serveur indexable et performant.
Personnaliser le message de confirmation de commande PrestaShop
Pour personnaliser le message de confirmation de commande PrestaShop, utilisez le système de traduction natif pour modifier les textes existants, ou surchargez le template payment_return.tpl pour ajouter du contenu. Stylisez toujours via CSS externe avec des classes dédiées, jamais en inline.
Gérer les réponses AJAX dans un module PrestaShop : validation et UX
Pour gérer différentes actions dans le callback success d'une requête AJAX PrestaShop, structurez votre réponse PHP en JSON avec un champ booléen success et un objet errors associatif, puis branchez votre logique JavaScript (désactivation du bouton, affichage ciblé des erreurs) en fonction de ce flag.
Implémenter un ScrollSpy sur vos fiches produits PrestaShop
Le ScrollSpy ajoute une navigation contextuelle sticky sur les fiches produits longues, améliorant l'UX en indiquant la section visible. Sur PrestaShop 1.6/1.7, utilisez le plugin Bootstrap natif ; sur PrestaShop 8.x, préférez l'API IntersectionObserver pour une solution sans dépendance, performante et compatible tous thèmes.
Affichage aléatoire dans PrestaShop : randomiser vos blocs Smarty
Pour afficher des blocs aléatoirement dans PrestaShop, utilisez {math equation="rand(min, max)"} en Smarty pour un résultat rapide, ou préférez ORDER BY RAND() / shuffle() côté PHP pour une solution robuste compatible avec le cache.
Afficher l'ancien prix unitaire dans PrestaShop avec Smarty
Pour afficher l'ancien prix unitaire barré dans PrestaShop, divisez le prix sans réduction par le unit_price_ratio via le plugin Smarty {math}, en déclarant toujours les variables comme paramètres nommés pour éviter les erreurs de calcul silencieuses.
Module PrestaShop sans affichage : corriger un AdminController défaillant
Un AdminController PrestaShop qui affiche une page blanche est presque toujours causé par une incohérence de nommage entre le fichier et la classe, un parent::__construct() appelé trop tôt, ou un cache class_index.php obsolète. Corrigez ces trois points et votre module fonctionnera.
Assigner un groupe client par défaut à l'inscription PrestaShop
Pour assigner un groupe client par défaut à l'inscription PrestaShop, il faut définir `id_default_group` AVANT l'appel à `add()`, puis utiliser `cleanGroups()` suivi de `addGroups()` pour gérer correctement les appartenances multiples.
Module PrestaShop qui se réenregistre sur un hook : diagnostic et solution
Quand un module PrestaShop revient systématiquement sur un hook après désenregistrement, c'est parce que sa méthode install() contient un registerHook() qui le réenregistre à chaque réinstallation. La solution : commenter cette ligne dans le fichier PHP du module, vérifier le rôle de ps_themecusto, et vider le cache.
Passer une variable Smarty dans jQuery sur PrestaShop
Pour récupérer une variable Smarty dans jQuery au sein d'une boucle foreach, utilisez les attributs HTML5 data-* pour injecter les valeurs dans le DOM, la balise {literal} pour protéger le JavaScript inline, et $(this).data('key') pour cibler l'élément précis cliqué par l'utilisateur.
Passer une variable produit (EAN13) au panier AJAX PrestaShop
Pour transmettre une variable produit (comme l'EAN13) au panier AJAX PrestaShop, utilisez des inputs cachés avec ID unique dans les boucles foreach, ou `{addJsDefL}` sur la fiche produit. En PrestaShop 8, préférez `Media::addJsDef()` dans un hook de module.
Créer un module dashboard PrestaShop avec requêtes SQL personnalisées
Créez un module PrestaShop qui affiche des données SQL personnalisées dans le tableau de bord via le hook dashboardZoneTwo, en utilisant DbQuery pour des requêtes sécurisées et un template Smarty pour le rendu.
Supprimer le logo et le pied de page des factures PDF PrestaShop
Pour supprimer le logo et le pied de page des factures PrestaShop, créez un override de HTMLTemplate qui retourne une chaîne vide dans getLogo() et getFooter(). Sur PS 8.x, privilégiez un module embarquant l'override pour une meilleure maintenabilité.
Afficher delivery_out_stock dans le panier PrestaShop
Pour afficher delivery_out_stock dans le panier PrestaShop, il faut overrider Cart.php pour ajouter ce champ à la requête SQL de getProducts(). Le piège principal est un décalage d'id_lang qui rend la variable vide — vérifiez que le contenu est rempli pour toutes les langues actives.
Ajouter un champ personnalisé au formulaire d'inscription PrestaShop
Pour ajouter un champ personnalisé (comme une case 'majeur') au formulaire d'inscription PrestaShop, il faut modifier la base de données, déclarer le champ dans l'objet Customer, override le contrôleur AuthController pour la validation et le message d'erreur, puis ajouter le HTML dans le template — sur PrestaShop 8.x, privilégiez un module avec les hooks Symfony plutôt qu'un override.
Variable $page_name et ID du body dans PrestaShop : diagnostic complet
L'absence de l'attribut id sur la balise body dans PrestaShop provient généralement d'un header.tpl modifié ou d'un contrôleur qui n'assigne pas la variable $page_name. Le diagnostic passe par l'affichage direct de la variable et la console debug Smarty.
Intégrer du JavaScript dans une page produit PrestaShop
Pour intégrer du JavaScript sur une fiche produit PrestaShop, utilisez {literal} dans les templates Smarty en 1.6, ou créez un module avec registerJavascript via le hook actionFrontControllerSetMedia en 1.7/8.x. Évitez d'insérer du JS dans la description longue car TinyMCE le supprime.
Trier le menu PrestaShop par ordre alphabétique (blocktopmenu)
Pour trier le menu blocktopmenu (ou ps_mainmenu) par ordre alphabétique, remplacez ORDER BY `position` par ORDER BY cl.`meta_title` ASC dans getCMSPages() et ORDER BY cl.`name` ASC dans getCMSCategories(), idéalement via un override pour survivre aux mises à jour.
Mettre à jour le stock depuis hookActionValidateOrder dans PrestaShop
Pour mettre à jour le stock depuis hookActionValidateOrder, utilisez Db::getInstance()->update() ou mieux, la classe StockAvailable. Les erreurs courantes sont les colonnes dupliquées dans le tableau PHP, un hook non enregistré, ou des colonnes NOT NULL manquantes.
Déplacer le bloc recherche PrestaShop dans le menu ou le header
Pour déplacer la barre de recherche PrestaShop, créez un hook personnalisé via un override du module et appelez-le dans le template souhaité. Sur PrestaShop 1.7+, la syntaxe widget permet de l'afficher n'importe où sans override.
Implémenter un système de prix libre sur PrestaShop (Name Your Price)
Implémentez un système de prix libre sur PrestaShop via un override de Product (mise à jour du prix) et du ProductController (validation sécurisée avec bornes min/max). Pour la production, préférez les SpecificPrice par client plutôt que la modification directe en base.
Thème enfant PrestaShop : résoudre les erreurs JavaScript après installation
Après l'installation d'un thème enfant PrestaShop, les bibliothèques JavaScript du thème parent ne sont pas toujours héritées automatiquement. Diagnostiquez via la console JS (F12), identifiez les scripts manquants dans le code source, puis enregistrez-les proprement via setMedia() ou le fichier theme.yml.
Connecter automatiquement un client après création de compte PrestaShop
Pour connecter automatiquement un client après création de compte sur PrestaShop, il faut injecter ses données dans le Context et le cookie via `Context::getContext()->cookie->__set()`, rattacher le panier existant avec le `secure_key`, puis déclencher les hooks d'authentification avant de rediriger.
Intégrer Bootstrap dans le menu PrestaShop : refonte du blocktopmenu
Le module blocktopmenu (ps_mainmenu depuis PS 1.7) peut être refactorisé pour utiliser les classes Bootstrap natives, ce qui résout les bugs mobile, facilite la personnalisation et permet d'intégrer panier et recherche directement dans la navbar.
Charger le CSS d'un module PrestaShop : hooks, chemins et bonnes pratiques
Le CSS d'un module PrestaShop ne se charge pas quand le hook displayHeader n'est pas enregistré à l'installation, quand le chemin du fichier est incorrect, ou quand une surcharge du thème interfère. Enregistrez le hook, utilisez addCSS() ou registerStylesheet(), et vérifiez qu'aucun dossier de surcharge dans le thème ne bloque le chargement.
Ajouter un champ personnalisé produit dans PrestaShop (back office et front)
Pour ajouter un champ personnalisé produit dans PrestaShop, il faut intervenir à 4 niveaux : colonne SQL dans ps_product_lang, déclaration dans la classe Product ($definition), ajout dans les requêtes SQL du catalogue (Category::getProducts), et affichage dans les templates. Sur PS 8.x, privilégiez un module avec les hooks Symfony plutôt qu'un override.
Rendre le numéro de TVA obligatoire si société renseignée sur PrestaShop
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+/8.x). Ne jamais modifier la classe Address.php pour cela.
Ajouter un champ image personnalisé aux catégories PrestaShop
Ajoutez un second champ image aux catégories PrestaShop via un override de la classe Category (PS 1.6/1.7) ou un module Symfony (PS 8.x), en modifiant la base de données, le back-office et les templates front-end.
Afficher des produits d'une catégorie sur une fiche produit PrestaShop
Pour afficher des produits d'une catégorie sur une fiche produit PrestaShop avec filtrage par caractéristique, créez un override de Category.php avec une méthode getProductsByFeature() qui joint les tables produit et caractéristique, puis appelez-la depuis un hook de module avec un template Smarty réutilisant les miniatures natives.
Déplacer le menu horizontal PrestaShop vers un autre hook
Pour déplacer le menu horizontal PrestaShop, remplacez le hook `displayTop` par `displayNav` dans la méthode install() du module, ajoutez une méthode `hookDisplayNav()` qui délègue au rendu existant, et réinstallez le module. Assurez-vous que le hook `header` est bien enregistré pour le chargement des CSS/JS.
Ajouter un champ date personnalisé aux détails de commande PrestaShop
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).
Afficher les déclinaisons produit sur les pages listing PrestaShop
Pour afficher les déclinaisons sur les listings produit PrestaShop, créez une méthode SQL joignant les tables d'attributs, assignez le résultat à Smarty dans le hook du module ou du contrôleur, puis parcourez le tableau dans le template avec un foreach. Attention au cache Smarty et à la déclaration de la variable dans la classe.