Jump to content

Demande à la Presta-Team :-)


Recommended Posts

Salut Philippe, Rémi, Lucas, l'équipe...

J'ai une petite demande à vous faire.
Voici le scénario :

Je crée l'onglet depuis un module.
(L'icône de l'onglet s'affiche bien -> j'ai réglé ceci avec Philippe)
Dans les tables héritières de AdminTab, nous avons la possibilité de saisir la classe modèle avec le membre className exemple : $this->className = 'Address';
Dans le cadre d'un module, afin qu'il soit "standalone", si j'ai une classe modèle exemple /modules/julienkifflaprestateam/monmodel.php je ne peux pas faire : $this->className = 'monModel'; car la fonction __autoload va la chercher dans le dossier classe ?
Peux t'on modifier la fonction __autoload afin de rendre plus propre le procédé ?
Ou faut-il faire un : include '/modules/julienkifflaprestateam/monmodel.php'; dans le fichier héritièr de AdminTab ?

Merci par avance !

Link to comment
Share on other sites

+1
Ca fait un moment que je souhaite également avoir les adminTab et les classes dans les modules sans devoir les copier dans adminNNN et classes.

Julien,
Comment fais-tu pour avoir le fichier adminXXX dot php dans ton module ?
directement à la racine du module et tu renseignes le champ 'module' lorsque tu ajoutes ton onglet ?

Link to comment
Share on other sites

En essayant pour l'adminXXX.php dans le module (cool, ca marche), j'ai jetté un oeil sur l'autoload.
Si la classe n'est pas trouvée dans le répertoire /classes/, je me dis que ca serait bien de la trouver dans modules/monModule/classes/

Du coup j'ai fait les 2 modifs suivantes

Modif dans le fichier config.inc.php :

function __autoload($className)
{
   if (!class_exists($className, false))
       if (file_exists (dirname(__FILE__).'/../classes/'.$className.'.php'))
           require_once(dirname(__FILE__).'/../classes/'.$className.'.php');
       else {
           $classFile = Module::getClassePathInModulesDirOnDisk($className);
           if ($classFile <> '')
               require_once ($classFile);
       }
}




Ajout dans le fichier classes/Module.php

    public static function getClassePathInModulesDirOnDisk($className)
   {
       $moduleList = array();
       $modules = scandir(_PS_MODULE_DIR_);
       foreach ($modules AS $name)
       {
           if (file_exists($classeFile = _PS_MODULE_DIR_.'/'.$name.'/classes/'.$className.'.php'))
           {
               if (!Validate::isModuleName($name) OR !Validate::isModuleName($className))
                   die(Tools::displayError().' (Module '.$name.' / Classe '.$className.')');
               return $classeFile;
           }
       }
       return '';
   }



Ca regarde dans le répertoire classes/ de chacun des modules présents
On pourrait rajouter un test pour vérifier que le module est bien installé.
J'ai gardé le Validate::isModuleName() sans trop savoir à quoi il sert ? à remplacer par un isName() ou un isClassName() à créer ?
Ca suppose qu'une même classe n'est pas définie entre 2 modules

Link to comment
Share on other sites

Je comprends très bien que ce cas est particulier... malgré que d'autre comme -m-a-g-e-n-t-o- zend le fond très bien.
Enfin __autoload est une fonction procédurale faite pour.

Ceci dit, quel intérêt de laisser la liberté d'utiliser des "TabClass" depuis un module si c'est pour en bridé le fonctionnement initial ?
D'ailleurs, je profite de ce post pour dire que la traduction d'un "TabClass" déporté ne fonctionne pas :-S Mais je suis bientôt en cours de résolution avec Philippe.

Merci pour ta réponse Damien :)

A bientôt !

Link to comment
Share on other sites

Damien,

L'autoload que je propose ne surcharge pas particulièrement : ca ne rajoute qu'un test file_exists() (bon certes, un accès disque mais qui sera en cache du serveur pour le require_once qui suit) et si la classe n'est pas trouvée, ca lance la boucle sur les modules.

Les cas ne sont peut-être pas si particulier que cela... ca permettrait d'avoir des modules totalement autonomes dans le prestaStore.

Les modules gèrent déjà le Front Office depuis leur répertoires, pourquoi pas le backoffice ?

Link to comment
Share on other sites

Damien,

L'autoload que je propose ne surcharge pas particulièrement : ca ne rajoute qu'un test file_exists() (bon certes, un accès disque mais qui sera en cache du serveur pour le require_once qui suit) et si la classe n'est pas trouvée, ca lance la boucle sur les modules.

Les cas ne sont peut-être pas si particulier que cela... ca permettrait d'avoir des modules totalement autonomes dans le prestaStore.

Les modules gèrent déjà le Front Office depuis leur répertoires, pourquoi pas le backoffice ?


Tout simplement +1 !
Link to comment
Share on other sites

Je vais parler dans le sens de Damien donc -1 :-S

@Matthieu,
Pour l'inclusion d'une classe, mon autoload ne surcharge pas. Mais effectivement, si on a 10 classes de modules à inclure, ca parcourt 10 fois les répertoires de modules, donc pas top, à moins de mettre une variable de cache...

@Julien
Pour l'include manuel, j'ai trouvé un module qui peut servir d'exemple, ca n'est effectivement pas si compliqué que ca :
module productcomments. Le require_once est fait dans chacun des fonctions qui en a besoin.

Link to comment
Share on other sites

Je vais parler dans le sens de Damien donc -1 :-S

@Matthieu,
Pour l'inclusion d'une classe, mon autoload ne surcharge pas. Mais effectivement, si on a 10 classes de modules à inclure, ca parcourt 10 fois les répertoires de modules, donc pas top, à moins de mettre une variable de cache...

@Julien
Pour l'include manuel, j'ai trouvé un module qui peut servir d'exemple, ca n'est effectivement pas si compliqué que ca :
module productcomments. Le require_once est fait dans chacun des fonctions qui en a besoin.


Je l'utilise actuellement, mais merci quand même.
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...