Override du PHP des modules prestashop 1.5
Il s’agit ici de pouvoir remplacer les modules depuis le chemin override/modules/mon_module/mon_module.php
, pour par exemple ajouter des HOOK.
Dans override/classes/modules
, nous allons créer la classe Module
afin de remplacer getInstanceByName
.
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');
/** On ajoute ça par rapport à la fonction de base**/
if (file_exists(_PS_OVERRIDE_DIR_.'modules/'.$module_name.'/'.$module_name.'.php')) {
// if file exists, include it
include_once(_PS_OVERRIDE_DIR_.'modules/'.$module_name.'/'.$module_name.'.php');
$module_name = $module_name.'_ovr';
}
/** end modif **/
if (class_exists($module_name, false))
return self::$_INSTANCE[$module_name] = new $module_name;
}
return false;
}
return self::$_INSTANCE[$module_name];
}
}
Analysons les lignes ajoutées :
if (file_exists(_PS_OVERRIDE_DIR_.'modules/'.$module_name.'/'.$module_name.'.php')) {
include_once(_PS_OVERRIDE_DIR_.'modules/'.$module_name.'/'.$module_name.'.php');
$module_name = $module_name.'_ovr';
}
La nouvelle classe aura pour nom nom_module_ovr. J’ai choisis le répertoire override pour les modules mais vous pouvez remplacer _PS_OVERRIDE_DIR_
par _PS_THEME_DIR_
pour que le PHP soit remplacé depuis le thème.
Ensuite, j’ai mon module dans /override/module/blockbestsellers/blockbestsellers.php
avec le code suivant :
class BlockBestSellers_ovr extends BlockBestSellers
{
protected function getBestSellers($params)
{
if (Configuration::get('PS_CATALOG_MODE'))
return false;
if (!($result = ProductSale::getBestSales((int)($params['cookie']->id_lang), 0, 5)))
return (Configuration::get('PS_BLOCK_BESTSELLERS_DISPLAY') ? array() : false);
$bestsellers = array();
$currency = new Currency($params['cookie']->id_currency);
$usetax = (Product::getTaxCalculationMethod((int)$this->context->customer->id) != PS_TAX_EXC);
foreach ($result as &$row)
$row['price'] = Tools::displayPrice(Product::getPriceStatic((int)$row['id_product'], $usetax), $currency);
return $result;
}
}
J’y ai remplacé getBestSalesLight
par getBestSales
pour avoir les produits plus en détails, et le tour est joué.
Afin que l’override ai bien lieu au niveau des classes il ne faut pas oublier de supprimer /cache/class_index.php
!