[1.3] Implanter des classes overrides



  • Le mécanisme des overrides est très pratique pour maintenir le coeur propre tout en ayant la capacité de faire des changements dans le code natif.
    Ce mécanisme n'est apparu qu'a partir de la version 1.4 de PrestaShop.

    Voici une implantation de ce mécanisme sur version antérieure.

    Il suffit d'injecter une fonction autoloader modifié en début du fichier config.inc.php

    /* Autoload */
    function __autoload($className)
    {
      if (function_exists('smartyAutoload') AND smartyAutoload($className))
        return true;
    
      $className = str_replace(chr(0), '', $className);
      $classDir = dirname(__FILE__).'/../classes/';
      $overrideDir = dirname(__FILE__).'/../override/classes/';
      $file_in_override = file_exists($overrideDir.$className.'.php');
      $file_in_classes = file_exists($classDir.$className.'.php');
    
      // This is a Core class and its name is the same as its declared name
      if (substr($className, -4) == 'Core')
        require_once($classDir.substr($className, 0, -4).'.php');
      else
      {
        if ($file_in_override && $file_in_classes)
        {
          require_once($classDir.str_replace(chr(0), '', $className).'.php');
          require_once($overrideDir.$className.'.php');
        }
        elseif (!$file_in_override && $file_in_classes)
        {
          require_once($classDir.str_replace(chr(0), '', $className).'.php');
          $classInfos = new ReflectionClass($className.((interface_exists($className, false) or class_exists($className, false)) ? '' : 'Core'));
          if (!$classInfos->isInterface() && substr($classInfos->name, -4) == 'Core')
            eval(($classInfos->isAbstract() ? 'abstract ' : '').'class '.$className.' extends '.$className.'Core {}');
        }
        elseif ($file_in_override && !$file_in_classes)
        require_once($overrideDir.$className.'.php');
      }
    }
    spl_autoload_register('__autoload');
    

    Créer ensuite votre répertoire /override/classes

    Pour toute classe que vous souhaitez modifier, changez le nom de la classe native dans son fichier pour la renommer en <class>Core
    Exemple pour la classe "Order":

    class OrderCore extends ObjectModel
    

    Puis créer votre fichier override comme dans les version ultérieures.

    Pratique pour normaliser tranquillement votre code en prévision d'une future migration
    NOTE: Lors de votre upgrade, prenez garde à la structure du répertoire classes (ex: Order.php => order/Order.php)