Julien Breux Posted June 25, 2009 Share Posted June 25, 2009 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 More sharing options...
Nommam Posted June 25, 2009 Share Posted June 25, 2009 Comme il est grossier lui ! Link to comment Share on other sites More sharing options...
Julien Breux Posted June 25, 2009 Author Share Posted June 25, 2009 Comme il est grossier lui ! :-$ Ha bon ? Link to comment Share on other sites More sharing options...
ningu Posted June 26, 2009 Share Posted June 26, 2009 +1Ca 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 More sharing options...
Julien Breux Posted June 26, 2009 Author Share Posted June 26, 2009 Je ferai bientôt un tutoriel complet sur la création de modules !Je r'up Link to comment Share on other sites More sharing options...
Atch Posted June 26, 2009 Share Posted June 26, 2009 cool....Et merkiV++Atch Link to comment Share on other sites More sharing options...
ningu Posted June 26, 2009 Share Posted June 26, 2009 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ésentsOn 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 More sharing options...
Damien Metzger Posted June 26, 2009 Share Posted June 26, 2009 Il faut faire un include manuel.On ne va pas alourdir l'autoload de tous les PS pour gérer un cas particulier comme celui-ci, qui se résoud très bien en include manuel.Car on serait obligés de scanner tous les répertoires de modules pour retrouver la classe en question. Link to comment Share on other sites More sharing options...
Julien Breux Posted June 26, 2009 Author Share Posted June 26, 2009 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 More sharing options...
ningu Posted June 26, 2009 Share Posted June 26, 2009 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 More sharing options...
Julien Breux Posted June 27, 2009 Author Share Posted June 27, 2009 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 More sharing options...
ningu Posted June 29, 2009 Share Posted June 29, 2009 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...@JulienPour 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 More sharing options...
Julien Breux Posted June 29, 2009 Author Share Posted June 29, 2009 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...@JulienPour 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 More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now