Rendre un module prestashop disponible pour tous les hooks

par Julien Achard | | Prestashop |
Rendre un module prestashop disponible pour tous les hooks

Dans un de mes récents développement, je devais programmer un module Prestashop qui devait avoir la particularité de pouvoir se greffer sur l’ensemble des hooks du front office, mais également dans des hooks personnalisés.

Après de longues recherches sur la toile, j’ai trouvé ma solution grâce à PHP et les surcharges magiques, notamment la surcharge __call(), documentation disponible ici.

Le principe est simple après ca, il suffit de se service de cette fonction pour faire croire à Prestashop que tout les méthodes reliées à un Hook sont disponibles, pour ce faire :

Fonction __call()
public function __call($name, $args) {
	if(preg_match('/^hook([a-zA-Z]\w+)$/', $name, $matches) && !is_callable($this, $name) ) {
		$hook_name = strtolower($matches[1]);
		return $this->executeHook($args, $hook_name);
	}
}

Une petite explication s’impose : le code de cette méthode est exécutée à chaque fois qu’une méthode de ma classe est appelée. Du coup je teste avec une expression régulière si la méthode appelée commence par hook, et si cette dernière n’existe pas déjà dans ma classe.

Si c’est le cas, j’appelle donc une méthode existante ( ici : executeHook ) et récupere en premier argument les paramètres du hook, en second son nom, il ne reste plus qu’à traiter le hook :

Fonction pour tout les hooks
public function executeHook( $params, $hook_name ) {
	// Action à effectuer
}

Bien évidemment à vous de gérer ensuite l’ajout et la suppression de votre module dans les hooks utiles avec registerHook et unregisterHook.