bshqsdnb Posted March 7, 2018 Share Posted March 7, 2018 Bonjour, Pour mon apprentissage de modules PrestaShop j'essaie de créer un mini-dispatcher (PrestaShop 1.7.2.4) dont voici le code : <?php class MyModCommentsCommentsModuleFrontController Extends ModuleFrontController { public function initContent() { parent::initContent(); $available_actions = ['list' => 'initList']; $module_action = Tools::getValue('module_action'); $id_product = (int)Tools::getValue('id_product'); if ($id_product > 0 && isset($available_actions[$module_action])) { $this->$available_actions[$module_action](); } } protected function initList() { $template = 'list.tpl'; $tpl = 'module:' . $this->module->name . '/views/templates/front/' . $template; $this->setTemplate($tpl); } } Le dispatcher appelle la fonction adéquate de manière dynamique en fonction du paramètre "module_action" passé en GET. A l'exécution j'ai une erreur lors de l'appel de la fonction : Quote ContextErrorException in comments.php line 12: Notice: Array to string conversion J'ai beau relire mon code je ne vois pas où une erreur aurait pu se glisser. Pourquoi me parle-t-on de problème de conversion d'un tableau vers une chaîne ? La valeur initList est bien de type string dans mon tableau pourtant. De plus je ne fais pas une conversion, je vais juste chercher la valeur de la clé "list". Je sèche donc toute aide sera la bienvenue. Merci d'avance, Sébastien Link to comment Share on other sites More sharing options...
BeComWeb Posted March 7, 2018 Share Posted March 7, 2018 Bonsoir. Essaye avec call_user_func() Link to comment Share on other sites More sharing options...
bshqsdnb Posted March 7, 2018 Author Share Posted March 7, 2018 Bonsoir, L'erreur est rigoureusement identique avec call_user_func(). Le message d'erreur contient également les informations suivantes : Quote in comments.php line 12 at ErrorHandler->handleError('8', 'Array to string conversion', '/var/www/devel/modules/mymodcomments/controllers/front/comments.php', '12', array('available_actions' => array('list' => 'initList'), 'module_action' => 'list', 'id_product' => '3')) in comments.php line 12 at MyModCommentsCommentsModuleFrontController->initContent() in Controller.php line 205 at ControllerCore->run() in Dispatcher.php line 379 at DispatcherCore->dispatch() in index.php line 28 La ligne 12 est l'appel à la fonction dynamique. Je ne comprends pas le message d'erreur déjà : je n'essaie à aucun moment de convertir un tableau en chaîne de caractères, je récupère directement une chaîne dans un tableau. Merci et bonne soirée, Sébastien Link to comment Share on other sites More sharing options...
bshqsdnb Posted March 8, 2018 Author Share Posted March 8, 2018 Bonjour, J'ai trouvé un workaround à défaut d'une vraie solution, pour ma part il doit s'agir d'un bug PHP car si je remplace $this->$available_actions[$module_action](); par $func = $available_actions[$module_action]; $this->$func(); ça fonctionne. Bonne journée ! Sébastien Link to comment Share on other sites More sharing options...
BeComWeb Posted March 8, 2018 Share Posted March 8, 2018 1 hour ago, bshqsdnb said: ...il doit s'agir d'un bug PHP ... Non c'est pas un bug PHP, s'il te dit que tu lui donnes un tableau là où il attend un string c'est qu'il a raison. Je sais que tu as trouvé une solution mais ton $this->$available_actions ne sert à rien. Un truc de ce style là fera l'affaire : $module_action = Tools::getValue('module_action'); ... if($id_product > 0 && method_exists($this, $module_action)){ call_user_func($module_action); } Link to comment Share on other sites More sharing options...
bshqsdnb Posted March 8, 2018 Author Share Posted March 8, 2018 Justement je ne te rejoins pas sur l'erreur indiquée, je ne lui donne pas un tableau mais bien une chaîne issue d'un tableau. D'ailleurs si je fais un echo $available_actions[$module_action]; j'ai bien la chaîne initList qui est affichée. Ou alors cette manière de faire n'est tout simplement pas supportée par PHP ? Le tableau est très utile au contraire : je peux y lister les actions disponibles et partant rejeter les actions pour lesquelles il n'est pas prévu. Je sais que ton code ferait l'affaire également mais dans ce tableau il est très aisé de voir en début de script toutes les actions supportées. Avec ton code il faudrait passer toutes les méthodes en revue. Belle journée, Sébastien 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