Jump to content

Recommended Posts

Quel est l'interet des classes dans \override?

On a la un repertoire qui ne contient que des classes vides.

Et il semblerait que presque chaque class xxxCore derive d'une de ces classes.

Du coup, si vous prenez par exemple IndexControllerCore, il a 4 classes parentes dont 2 vides:

  ControllerCore
 ↑
  Controller (vide)
 ↑
FrontControllerCore
 ↑
 FrontController (vide)
 ↑
IndexControllerCore

Link to comment
Share on other sites

Moué en fait je pensais ça mais non, voir Autoload :: load().

 

Pour moi le seul intérêt, c'est de toujours utiliser la classe fille. Au pire, elle est vide, et uniquement les fonctionnalités de base sont utilisées.

 

Mais en fait non :)

 

// If $classname has not core suffix (E.g. Shop, Product)
 if (substr($classname, -4) != 'Core')
 {
  // If requested class does not exist, load associated core class
  if (isset($this->index[$classname]) && !$this->index[$classname])
  {
   require_once($this->root_dir.$this->index[$classname.'Core']);
   if (file_exists($this->root_dir.'override/'.$this->index[$classname.'Core']))
   {
  $this->generateIndex();
  require_once($this->root_dir.$this->index[$classname]);
   }
   else
   {
 // Since the classname does not exists (we only have a classCore class), we have to emulate the declaration of this class
 $class_infos = new ReflectionClass($classname.'Core');
 eval(($class_infos->isAbstract() ? 'abstract ' : '').'class '.$classname.' extends '.$classname.'Core {}');
   }
  }
  else
  {
   // request a non Core Class load the associated Core class if exists
   if (isset($this->index[$classname.'Core']))
 require_once($this->root_dir.$this->index[$classname.'Core']);
   if (isset($this->index[$classname]))
 require_once($this->root_dir.$this->index[$classname]);
  }
 }
 // Call directly ProductCore, ShopCore class
 else
  require_once($this->root_dir.$this->index[$classname]);

Link to comment
Share on other sites

Bonjour,

avant cette modification (l'ajout des classes filles vides), l'autoload créait "virtuellement" ces classes via un eval.

 

Cette modification a été faîte pour ces raisons :

- Permettre aux IDE de faire de l'autocomplétion afin de faciliter la vie des développeurs

- Optimiser la mémoire et la rapidité de l'autoload

- Permettre aux développeurs de plus facilement voir et utiliser le système d'override (trop peu connaissaient son existence, ou savaient comment l'utiliser)

- Supprimer cet affreux eval

 

Cordialement

Edited by Raphaël Malié (see edit history)
  • Like 1
Link to comment
Share on other sites

Le principe c'est de permettre aux développeurs de faire du développement spécifique sans toucher au cœur de PrestaShop.

 

Par exemple si tu prends la méthode Link->getPageLink(), imagine que tu as besoin pour ton projet de faire en sorte qu'elle fasse quelque chose de spécial, il te suffit de la surcharger. Donc dans ce cas tu vas dans le fichier overrides/classes/Link.php et tu ajoutes dans la classe une méthode comme ça :

public function getPageLink()
{
  // traitement spécifique

  return parent::getPageLink();
}

Link to comment
Share on other sites

  • 1 month later...

Bonjour,

 

 

Dommage que les développeurs n'ont pas prévu qu'il n'était pas les seuls à utiliser des classes "Core", ça m'aurait évité quelques problèmes d'inclusion du sdk d'Amazon.

 

Comme l'autoload n'est pas lui-même surchargeable et que le sdk d'Amazon possède son propre chargement de classe ont se retrouve avec une belle Fatal error lors du chargement du "RequestCore".

 

Je n'ai pas trouvé d'autre solution ce que modifier la classe "Autoload" si vous avez une autre solution je suis preneur.

merci

Edited by Prestaspirit (see edit history)
Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...