PrestaShop 1.5 – Gérer la rétro-compatibilité des modules pour les versions 1.4

5
112

La nouvelle version de PrestaShop est maintenant sortie en version finale et les développeurs doivent maintenant adapter leurs modules et thèmes pour la fameuse 1.5. Pourtant, il est judicieux de garder une rétro-compatibilité vers l’ancien 1.4 qui sera encore très répandu et utilisé pendant quelques temps.

Le premier conseil est de développer le module pour la 1.5, avec les nouvelles méthodes. Une fois que le module a été testé et optimisé sur la dernière version, alors, le travail de rétro-compatibilité peut commencer !

Sachez que les méthodes d’installation et de désinstallation ne changent pas, idem pour le constructeur. Afin de pouvoir faire des conditions bien précises suivant les versions de PrestaShop, vous avez besoin de tester cette dernière. La méthode a utiliser (la plus performante et conseillé par les développeurs du CMS) est la fonction PHP version_compare.

Pour l’utiliser, rien de plus simple :

if (version_compare(_PS_VERSION_,’1.5′,’>’)) { // Votre code spécifique aux versions 1.5.x  }

if (version_compare(_PS_VERSION_,’1.4′,’>=’) && version_compare(_PS_VERSION_,’1.5′,'<‘)) { // Votre code spécifique aux versions 1.4.x }

Avec ceci, vous voila paré à toute éventualités ! Bien entendu, vous pouvez utiliser cette méthode pour réaliser une compatibilité avec des versions antérieures du système… après à voir si cela est intéressant pour un module ou pas.

Ensuite, le gros du travail commence. Faites bien le tour de votre module et des nouveautés proposées par le nouveau PrestaShop. Par exemple, pour ajouter un fichier CSS dans le header en 1.4.x, il était coutume de faire comme ceci :

Tools::addCSS(_THEME_CSS_DIR_.’style.css’);

Or maintenant, avec la 1.5.x, il est nécessaire de passer par le Context de cette manière :

$this->context->controller->addCSS(_THEME_CSS_DIR_.’style.css’);

Le Context vous permettra d’accéder à n’importe quel objet du système, très pratique donc et plus propre car il élimine l’utilisation massive des variables globales !

Vous pouvez rencontrer aussi des problèmes de compatibilité au niveau des templates. En effet, il a évolué dans la nouvelle version. Alors, au lieu de bricoler des rustines bancales, pensez à créer des templates pour chacune des versions majeures !

$this->display(__FILE__, ‘psblocksearchimg_14.tpl’); // Si l’on est en 1.4.x, on affiche le template dédié 1.4

$this->display(__FILE__, ‘psblocksearchimg_15.tpl’); // Si l’on est en 1.5.x, on affiche le template dédié 1.5

Pour les assignations Smarty (le moteur de template PHP), il est bien de faire de même. En effet, avant il fallait déclarer global $smarty; afin de pouvoir accéder à Smarty et de pouvoir y assigner nos nouvelles variables. Voici une solution de rétro-compatibilité :

private function calculHookCommon($params)
    {
        if (version_compare(_PS_VERSION_,’1.4′,’>=’) && version_compare(_PS_VERSION_,’1.5′,'<‘)) {
            global $smarty;
            $smarty->assign(array(
                ‘ENT_QUOTES’ =>        ENT_QUOTES,
                ‘search_ssl’ =>        (int)Tools::usingSecureMode(),
                ‘ajaxsearch’ =>        Configuration::get(‘PS_SEARCH_AJAX’),
                ‘instantsearch’ =>    Configuration::get(‘PS_INSTANT_SEARCH’),
                ‘ps_version’ =>        _PS_VERSION_,
            ));
            return true;
        }
        elseif (version_compare(_PS_VERSION_,’1.5′,’>’)) {
            $this->context->smarty->assign(array(
                ‘ENT_QUOTES’ =>        ENT_QUOTES,
                ‘search_ssl’ =>        Tools::usingSecureMode(),
                ‘ajaxsearch’ =>        Configuration::get(‘PS_SEARCH_AJAX’),
                ‘instantsearch’ =>    Configuration::get(‘PS_INSTANT_SEARCH’),
                ‘ps_version’ =>        _PS_VERSION_,
            ));
            return true;
        }
    }

Avec ceci, aucun problème ! Dernier point important à aborder : les overrides.

C’est un élément primordial pour tout développeur PrestaShop : les overrides permettent de modifier le cœur du CMS tout en gardant une évolutivité (on peut ainsi continuer à mettre à jour son site régulièrement). Ces overrides peuvent être créés depuis un module. Or, en 1.4.x, il étaient très mal gérés, il fallait bidouiller en PHP afin de savoir s’il existait déjà un fichier ou non, quelles méthodes il contenait, etc. Maintenant, grâce à l’ingéniosité des développeurs PrestaShop, la dernière version embarque directement des méthodes de gestion des overrides ! Et ça, ça va faire des heureux à coup sûr. Voici une méthode permettant de gérer les overrides tant en 1.4.x qu’en 1.5.x :

public function psOverride($mod)
    {
        if ($mod == ‘install’) {
            if (version_compare(_PS_VERSION_,’1.4′,’>=’) && version_compare(_PS_VERSION_,’1.5′,'<‘)) {
                if (!file_exists(‘../override/controllers/SearchController.php’))
                    if (!copy(‘../modules/mon_module/ps_14/SearchController.php’, ‘../override/controllers/SearchController.php’))
                        return false;
                if (!file_exists(‘../override/classes/Search.php’))
                    if (!copy(‘../modules/mon_module/ps_14/Search.php’, ‘../override/classes/Search.php’))
                        return false;
            }
            return true;
        }
        elseif ($mod == ‘uninstall’) {
            if (version_compare(_PS_VERSION_,’1.4′,’>=’) && version_compare(_PS_VERSION_,’1.5′,'<‘)) {
                if (!file_exists(‘../override/controllers/SearchController.php’))
                    if (!unlink(‘../override/controllers/SearchController.php’))
                        return false;
                if (!file_exists(‘../override/classes/Search.php’))
                    if (!unlink(‘../override/classes/Search.php’))
                        return false;
            }
            return true;
        }
    }

Appelez seulement cette méthode lors de l’installation et la désinstallation de votre module et le tour est joué ! (adaptez-la avant bien entendu).

D’autres articles de ce genres, peut être plus complets viendront par la suite. Sachez que je suis joignable via le forum officiel PrestaShop sous le pseudo de Dev On Web. N’hésitez pas à me contacter la bas pour toute question ou en commentaire sur cet article.

5 Commentaires

  1. Il est très bien avec cette information utile que je devrais savoir si elle plus tôt. Il me aidera beaucoup dans le développement du module est compatible avec Prestashop 1.4

  2. Merci beaucoup pour ces petites astuces. Qui peuvent aider à la rétro-compatibilité comme à la mise à jour d’anciens modules.

    Moi j’ai encore du mal avec le concept de “context” 🙂

  3. Bonjour,

    je suis débutant en dev sur Prestashop et tout d’abord merci pour cet article très intéressant. Je n’ai pas trouvé la réponse à mon problème en revanche.
    Mon module se greffe sur le hook actionOrderStatusUpdate pour prestashop 1.5 et ce hook porte un nom différent dans les versions précédentes.
    Est ce que je peux, dans la méthode install(), greffer à la fois sur le hook actionOrderStatusUpdate et sur le hook qui correspond aux versions antérieures sans que cela pose de problème ?

    Merci pour votre aide !

Les commentaires sont fermés.