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 !