Jump to content

Création d'un mini-dispatcher


Recommended Posts

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

Bonsoir,

L'erreur est rigoureusement identique avec call_user_func().

Le message d'erreur contient également les informations suivantes :

Quote
  1. in comments.php line 12
  2. 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
  3. at MyModCommentsCommentsModuleFrontController->initContent() in Controller.php line 205
  4. at ControllerCore->run() in Dispatcher.php line 379
  5. 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. :blink:

 

Merci et bonne soirée,

 

Sébastien

Link to comment
Share on other sites

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

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

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

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...