Override des modules dans Prestashop

par Julien Achard | | Prestashop |
Override des modules dans Prestashop

Prestashop est un logiciel e-commerce formidable, on peut faire des override sur tout ! Enfin presque tout … je pense évidemment aux modules. Je comprend que pour leur maintenance, il n’est pas envisageable de rendre un override possible, qu’à cela ne tienne, avec ce tutoriel je vais vous montrer comment on peut simplement rendre possible l’impossible.

Cette solution est valable pour prestashop à partir de la version 1.5, pour la 1.4 le même principe est applicable, mais je ne le donnerai pas ici.

Pour atteindre notre but nous allons devoir modifier la classe Module, et plus précisément la méthode getInstanceByName. Pour cela nous allons créer un override :

override/classes/module/Module.php
abstract class Module extends ModuleCore
{
	
	public static function getInstanceByName($module_name)
	{
		if (!Validate::isModuleName($module_name))
		{
			if (_PS_MODE_DEV_)
				die(Tools::displayError($module_name.' is not a valid module name.'));
			return false;
		}

		if (!isset(self::$_INSTANCE[$module_name]))
		{
			if (Tools::file_exists_cache(_PS_MODULE_DIR_.$module_name.'/'.$module_name.'.php'))
			{
				include_once(_PS_MODULE_DIR_.$module_name.'/'.$module_name.'.php');
				
				if (file_exists(_PS_ROOT_DIR_.'/override/modules/'.$module_name.'/'.$module_name.'.php'))
				{
					include_once(_PS_ROOT_DIR_.'/override/modules/'.$module_name.'/'.$module_name.'.php');
					$module_name = $module_name.'_ovr';
				}
				
				if (class_exists($module_name, false))
					return self::$_INSTANCE[$module_name] = new $module_name;
			}
			return false;
		}
		return self::$_INSTANCE[$module_name];
	}
}

Si vous regardez les lignes rajoutées dans la méthode, vous comprendrez que si le fichier override/modules/{nom_module}/{nom_module}.php existe, il sera automatique inclus et pris en compte.

Et cela devient intéressant, car si nous souhaitions par exemple que le module Editorial ne s’affiche non pas sur le Hook « Home » ( comme il l’est par défaut ), mais plutôt sur la colonne de gauche « displayLeftColumn », il nous suffirait donc de créer le fichier override/modules/editorial/editorial.php ainsi :

override/modules/editorial/editorial.php
class Editorial_ovr extends Editorial
{
	public function install()
	{
		return
			parent::install() &&
			$this->unregisterHook('displayHome') &&
			$this->registerHook('displayLeftColumn');
	}

	public function hookDisplayLeftColumn($params)
	{
		return $this->hookDisplayHome($params);
	}
}

Le tour est joué, lors de l’installation de votre prochain module, ce dernier sera finalement greffé sur la colonne de gauche « displayLeftColumn ».

Télécharger l'exemple