Jump to content

Comment avoir des modules compatible 1.7 avec les namespaces (use) ?


Recommended Posts

Bonjour a tous,

je travail sur mes modules pour les rendre compatible Prestashop 1.7.

 

Mon objectif est d'avoir un même module compatible à la fois 1.6 et 1.7.

 

Mais le problème c'est que les namespaces me bloque.

 

Si je prend l'exemple d'un module de paiement il faut désormais utiliser la classe "PaymentOption" que l'on appel avec un namespace comme ceci:

use PrestaShop\PrestaShop\Core\Payment\PaymentOption;

Le problème c'est que sous Prestashop 1.6 cette classe n'existe pas.

 

Du coup si j'appel cette classe avec use.

J'ai un message d'erreur me disant que la classe n'existe pas (logique :D).

 

Et évidemment on ne peut pas faire un include de la classe vu qu'elle utilise d'autres namespace à l'intérieur.

 

Donc ma question est: comment vous faites pour avoir un module à la fois compatible 1.6 et 1.7 dès que des namespace  sont impliqués ?

 

 

Link to comment
Share on other sites

Salut,

 

le 1er soucis est que les namespaces ne peuvent pas être utilisés en 1.6 qui est compatible PHP5.2.

Je ferai 3 fichiers, un pour la 1.7, un pour la 1.6 et la racine du module qui inclue l'un ou l'autre suivant la version de Presta.

Link to comment
Share on other sites

Moi j'ai un seul fichier qui contient les 2 classes, et la déclaration est précédée par un if (version_compare(...)) classe1 else classe2.

 

Le use est en dehors du if (sinon ca plante) et lors de mes tests tout fonctionnait bien, mais effectivement mon php était le même sur tous mes prestas.

 

Ceci dit j'ai des clients en php 5.2 et ça fonctionne, le "use" semble ignoré mais ne crash pas, ou bien j'ai raté un truc.

Link to comment
Share on other sites

Je viens de tester sur le module "cheque" basique d'un prestashop 1.6.1.11

Si au début du module tu rajoute:

use PrestaShop\PrestaShop\Core\Payment\PaymentOption;

Ensuite dans la page des modules tu as 2 erreurs:

 

 

cheque (parse error in /modules/cheque/cheque.php)
cheque (class missing in /modules/cheque/cheque.php)

 

Comment fais-tu pour ne pas avoir ce type d'erreurs avec ton module ?

Link to comment
Share on other sites

Moi j'ai un seul fichier qui contient les 2 classes, et la déclaration est précédée par un if (version_compare(...)) classe1 else classe2.

 

Le use est en dehors du if (sinon ca plante) et lors de mes tests tout fonctionnait bien, mais effectivement mon php était le même sur tous mes prestas.

 

Ceci dit j'ai des clients en php 5.2 et ça fonctionne, le "use" semble ignoré mais ne crash pas, ou bien j'ai raté un truc.

 

Si ça fonctionne c'est bien mais je ne m'y risquerait pas.

Déjà deux classes dans un fichier ça me fait bizarre et le "je sais pas pourquoi ça fonctionne, ça devrait pas, mais on laisse" bin :)

Link to comment
Share on other sites

Je viens de tester sur le module "cheque" basique d'un prestashop 1.6.1.11

Si au début du module tu rajoute:

use PrestaShop\PrestaShop\Core\Payment\PaymentOption;

Ensuite dans la page des modules tu as 2 erreurs:

 

Comment fais-tu pour ne pas avoir ce type d'erreurs avec ton module ?

 

Bonjour

 

J'utilise des namespaces pour certains de mes modules sous 1.6. Pour éviter ce genre d'erreur j'override getModulesOnDisk et plus particulièrement vers la ligne 1361.

 

Je remplace 

if (eval('if (false){	'.$file."\n".' }') !== false) {
    require_once(_PS_MODULE_DIR_.$module.'/'.$module.'.php');
} else {
    $errors[] = sprintf(Tools::displayError('%1$s (parse error in %2$s)'), $module, substr($file_path, strlen(_PS_ROOT_DIR_)));
}

Par

if (in_array($module, ["monmodule1", "monmodule2"])) {
    require_once(_PS_MODULE_DIR_.$module.'/'.$module.'.php');
}
else {
    // If (false) is a trick to not load the class with "eval".
    // This way require_once will works correctly
    if (eval('if (false){   '.$file."\n".' }') !== false) {
        require_once(_PS_MODULE_DIR_.$module.'/'.$module.'.php');
    } else {
        $errors[] = sprintf(Tools::displayError('%1$s (parse error in %2$s)'), $module, substr($file_path, strlen(_PS_ROOT_DIR_)));
    }
}

L'idée étant de forcer le require pour certains module. Je précise que ce sont des modules internes à mon site. ça doit pas forcément être très propre pour des modules destiné a être partagé mais c'est une piste. :/

  • Like 1
Link to comment
Share on other sites

Hello,

j'ai discuté avec la team prestashop lors du PrestashopDay et la solution est super simple :).

 

Il suffit de ne pas appeler le "use" au début du module.

 

Et d'appeler la classe comme ceci:

 

$newOption = new PrestaShop\PrestaShop\Core\Payment\PaymentOption;

 

Avec le namespace complet au lieu de simplement le nom de la classe.

Link to comment
Share on other sites

Le namespace reste incompatible PHP 5.2 donc incompatible avec PrestaShop 1.6 il y a risque de page blanche.

 

Il est incompatible avec certain hébergement, pas spécialement avec Prestashop 1.6.

 

On pourrait débattre longuement sur le sujet :).

 

Je n'ai pas testé mais la fonction contenant le namespace ne sera jamais appelé sur une 1.6 donc pas sûr que ça bug.

Et si c'est le cas corriger le problème sera très simple (supprimer la ligne qui ne sert à rien du coup).

Link to comment
Share on other sites

avec PHP5.2 $newOption = new PrestaShop\PrestaShop\Core\Payment\PaymentOption; est une erreur de syntaxe et le fichier ne compilera pas que la ligne soit appelée ou non.

 

ensuite oui on peut discuter de ça longtemps. Je me souviens d'une version de Presta qui avait $x?:$y (opérateur ternaire raccourci incompatible PHP 5.2) et ils ont du sortir une version d'urgence parce que des boutiques n'affichaient plus rien même si le code en lui même n'était pas exécuté.

 

Bref je ne le ferais pas mais ça n'engage que moi

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...