Olivier CLEMENCE Posted June 13, 2017 Share Posted June 13, 2017 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 ). 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 More sharing options...
shagshag Posted June 13, 2017 Share Posted June 13, 2017 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 More sharing options...
Olivier CLEMENCE Posted June 13, 2017 Author Share Posted June 13, 2017 ah yes merci !!!! J'ai testé ça semble marcher Link to comment Share on other sites More sharing options...
Yann - Prestaplugins Posted June 14, 2017 Share Posted June 14, 2017 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 More sharing options...
Olivier CLEMENCE Posted June 14, 2017 Author Share Posted June 14, 2017 Tu veux dire que sur un prestashop 1.6 même avec le use ça ne plante pas ? Ben ça alors... pourquoi ça plantait chez moi 0o ? Link to comment Share on other sites More sharing options...
Olivier CLEMENCE Posted June 14, 2017 Author Share Posted June 14, 2017 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 More sharing options...
shagshag Posted June 14, 2017 Share Posted June 14, 2017 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 More sharing options...
Matt K. Posted June 19, 2017 Share Posted June 19, 2017 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. :/ 1 Link to comment Share on other sites More sharing options...
Olivier CLEMENCE Posted June 21, 2017 Author Share Posted June 21, 2017 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 More sharing options...
shagshag Posted June 21, 2017 Share Posted June 21, 2017 Le namespace reste incompatible PHP 5.2 donc incompatible avec PrestaShop 1.6 il y a risque de page blanche. Link to comment Share on other sites More sharing options...
Olivier CLEMENCE Posted June 21, 2017 Author Share Posted June 21, 2017 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 More sharing options...
shagshag Posted June 21, 2017 Share Posted June 21, 2017 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now