Prestashop : comment dupliquer un module

Un module ne peut être instancié qu’une seule fois sous Prestashop. Si vous tenté d’installer un module qui est déjà présent et installé (même en modifiant le nom du dossier et le nom du fichier PHP), cela générera une erreur.

dupliquer-module

erreur-module

J’utilise Prestashop 1.6.0.14 et le module qui sera utilisé dans cette démo est homefeatured.

En premier lieu, copiez le dossier prestashop/modules/homefeatured vers prestashop/modules/homefeatured2. Profitez-en pour renommer le fichier homefeatured.php dans le dossier nouvellement créé en homefeatured2.php.

En fonction du module, la tâche peut être plus ou moins difficile. Pour le dupliquer, il faut remplacer toutes les références à une classe déjà existante (le même module déjà installé).

Par exemple :

class HomeFeatured extends Module
{
    protected static $cache_products;

    public function __construct()
    {
        $this->name = 'homefeatured';
        $this->tab = 'front_office_features';
        $this->version = '1.6.2';
        $this->author = 'PrestaShop';
        $this->need_instance = 0;

Deviendra :

class HomeFeatured2 extends Module
{
    protected static $cache_products;

    public function __construct()
    {
        $this->name = 'homefeatured2';
        $this->tab = 'front_office_features';
        $this->version = '7.7.7';
        $this->author = 'PrestaShop';
        $this->need_instance = 0;

Le numéro de version est fictif mais permet de différencier les deux modules. Préférez un numéro de version suffisamment éloigné de la version actuelle.

prestashop-dupliquer-module

[x_alert type= »success »]Si vous avez un problème de traduction à cette étape, pensez aussi à remplacer les chaines {homefeatured} en {homefeatured2} et homefeatured_ en homefeatured2_ dans le fichier fr.php du dossier homefeatured2/translations.[/x_alert]

Maintenant que vous avez modifié le nom de la classe, il faut remplacer chaque appel à cette classe. Cherchez les chaines HomeFeatured:: et remplacez les par HomeFeatured2::.

C’est pas mal, mais ce n’est pas terminé. Le module met à jour certains paramètres dans la base de donnée. Si ces paramètres sont les mêmes que le module original, vous ne pourrez pas les configurer indépendamment de l’autre. La fonction install() nous donne quelques informations par rapport à ces paramètres :

Configuration::updateValue('HOME_FEATURED_NBR', 8);
Configuration::updateValue('HOME_FEATURED_CAT', (int)Context::getContext()->shop->getCategory());
Configuration::updateValue('HOME_FEATURED_RANDOMIZE', false);

Trois variables sont utilisées ici. Vous pouvez donc les remplacer par un autre nom. Dans mon cas :

Configuration::updateValue('HOME_FEATURED_NBR2', 8);
Configuration::updateValue('HOME_FEATURED_CAT2', (int)Context::getContext()->shop->getCategory());
Configuration::updateValue('HOME_FEATURED_RANDOMIZE2', false);

Remplacez bien toutes les chaines du modules et des autres fichiers utilisés dans le module, si nécessaire. Là encore, cela dépend du module que vous souhaitez dupliquer.

remplacer-tout

Notez que si le thème que vous utilisez fait une surcharge du fichier .tpl du module, il faudra faire la surcharge pour la copie également. Il faudra également surement jouer avec les points d’accroche.

tpl-prestashop

Télécharger notre module d’exemple : homefeatured2.zip.

Télécharger Block CMS 2.1.1 pour Prestashop 1.6.5.1 : blockcms2.zip

Prestashop : afficher le nom d'une catégorie grâce à son ID
Prestashop : limiter l'arborescence du top menu

21 Comments on “Prestashop : comment dupliquer un module”

  1. Merci pour l’astuce c’est très pratique. Je souhaite faire de même pour le module Bloc CMS pour pouvoir inclure un second en pied de page. La manipulation sera identique ?

    1. Effectivement c’est la même chose. Vous pouvez garder la classe BlockCMSModel identique et ne modifier que la classe BlockCMS dans votre cas normalement.

  2. j’ai une petite question qui est en fait une demande précision : lorsque vous dite « Cherchez les chaines HomeFeatured:: et remplacez les par HomeFeatured2:: », il faut chercher quoi en fait?
    Car de mon cote, c’est le module FAQ que je souhaiterai dupliquer et j’ai ouvert tous les fichiers du module à la recherche de « faq:: », mais je n’ai trouvé aucun résultats!.

    1. Bonjour,
      Il faut chercher l’ancien nom du module.

      class NomModule extends Module
      -> NomModule est la chaîne à remplacer.

  3. Je reviens vers toi car malheureusement je ne suis pas arrivé à dupliquer le module blockcms. Si tu as le module modifier je suis preneur ;)

  4. Bonjour,
    Je souhaiterais dupliquer « Bloc CMS d’information client ».
    J’utilise Prestashop 1.6.0.11 et le module par défaut possède la version 1.6.0.

    Or j’ai des soucis.
    J’ai changé le nom des fichiers, des tables en base de données et des variables comme indiqué dans ce tuto.
    Les 2 tables « ps_info2 » et « ps_info_lang2 » sont bien créées lors de l’installation du module.
    Cependant, les données d’initialisation du module vont se ranger dans l’ancien module (tables « ps_info » et « ps_info_lang »).
    Et le module 2 est inutilisable (impossible de créer une nouvelle entrée).

    Savez-vous s’il y a un « controllers » ou une « classe » à modifier en dehors du module ?

    Merci de votre aide !

    1. Bonjour,
      Votre problème est commun.
      Il n’y a pas besoin de modifier de classe ou de controller de Prestashop mais il faut modifier le nom de la table également dans toutes les autres fonctions du module.
      getListContent(), getInfos() ainsi que dans le fichier InfoBlock.php du dossier classe du module (‘table’ => ‘info’).
      Il faut vraiment faire le tour des fichiers du module.

  5. Bonjour,
    bonnes infos, très appréciables!!

    Je souhaite dupliquer un module bien plus compliqué, PayPal. Est-ce possible? Quelle serait la marche à suivre? Dois-je renommer toutes les occurrences de PayPal trouvées dans les fichiers php, ou seulement à certains endroits?

    Toute aide serait appréciable, d’avance merci!

  6. Bonjour,

    Je souhaite également dupliquer le module Block CMS, mais j’ai du trop en faire et j’ai un message d’erreur. Je n’avais pas compris qu’il fallait modifier des table dans la BDD. Où alors j’ai pas compris le tuto :)

    Auriez vous le fichier modifié s’il te plaît ? Comme « Nico » te l’avais demandé, j’ai bon espoir.

    Un grand merci d’avance et bravo pour ce tuto !

  7. Bonjour,
    Je souhaiterai, comme Nico, dupliquer le module Bloc CMS (footer). Mais, je n’y arrive pas.
    Peut-être l’avez vous en stock ? Ma version du module est la 2.1.1 (version de base de prestashop 1.6.1.5). Si vous n’avez pas cette version, mais une plus ancienne, je suis preneur. Je pourrais ainsi comparer les fichiers.

    En vous remerciant.

      1. Bonjour Jérôme.
        Merci beaucoup pour l’ajout du module en fin d’article.
        J’ai réussi à l’installer.
        Par contre, je rencontre un pb.
        Lorsque j’active le module et que je sélectionne les liens cms à insérer, il me les change également dans le bloc CMS de base. Et idem, dans le sens opposé.
        Du coup, j’ai bien 2 modules de bloc cms différents, mais avec les mêmes liens.

        Une idée ?

      2. Bonjour,
        C’est probablement oublié une chaîne quelque part.
        Le nouveau module fait toujours un appel à la table du module de base.

  8. Bonjour.
    Article très intéressant, car je cherche moi aussi à dupliquer un module : le homeslider
    Mais je rencontre quelques difficultés. Autrement dit j’ai suivi à la lettre toutes les étapes de modification des classes et des noms des fichiers : homeslider en homeslider2
    Ainsi que les updatevalue dans les deux sens : HOMESLIDER2_SPEED ainsi que HOMESLIDER_SPEED2
    Par contre je ne vois pas comment surcharger le fichier.tpl du module.
    Et donc, impossible de l’installer, j’ai toujours le message qui me dit que le module est déjà installé.
    Merci pour vos réponses

  9. je retouurne pouur vous remerciier infiniment !!
    j’ai réussi de crier une copie du module !!
    s’il vous plait si je veux changer la variable par exemple dans homefeatured on affiche les produits , si je veux afficher les marques (les sociétés fabricants) que dois je faire ?

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *