renaud2263 Posted May 18, 2016 Share Posted May 18, 2016 (edited) Bonjour à Tous, En suivant quelques tutos sur le sujet, je cherche à créer mon 1er module. C'est un petit module de stats qui n'a aucun lien avec le front et ne nécessite pas de table SQL sauf les existantes. Voici ce que j'ai fait : Mon module se nomme Toto. 1- Création d'un dossier "toto" dans modules 2- Dans ce dossier, un fichier toto.php 3- Dans ce fichier: class Toto extends Module avec les fonctions install etc... 4- Dans la méthode install : $tab->class_name = 'AdminToto'; 5- Dans controllers/admin, le fichier AdminTotoController.php 6- Dans ce fichier : class AdminTotoController extends ModuleAdminController Puis j'ai installé le module et tout s'est bien passé. Le lien s'affiche bien dans le menu du B.O. Mais lorsque je le clique, j'ai le message "Contrôleur introuvable". Le lien est du type: monsite.com/admin123456/index.php?controller=AdminToto&token=c124d75435732399b9a6172d5e1fe380 Qu'est ce que j'ai raté ? Edited May 18, 2016 by renaud2263 (see edit history) Link to comment Share on other sites More sharing options...
renaud2263 Posted May 18, 2016 Author Share Posted May 18, 2016 Bonjour, merci pour ta suggestion mais résultat idem... Link to comment Share on other sites More sharing options...
renaud2263 Posted May 18, 2016 Author Share Posted May 18, 2016 Précision: Dans le fichier class_index.php j'ai bien : 'AdminTotoController' => array ( 'path' => 'controllers/admin/AdminTotoController.php', 'type' => 'class', 'override' => false, ), Link to comment Share on other sites More sharing options...
erouvier29 Posted May 18, 2016 Share Posted May 18, 2016 $tab->module = 'toto' ? Link to comment Share on other sites More sharing options...
renaud2263 Posted May 18, 2016 Author Share Posted May 18, 2016 C'est ca index.php?controller=AdminToto&token=c124d75435732399b9a6172d5e1fe380 qui est inrouvable? Oui. J'ai le header et le footer et le message d'erreur provient de Presta. Ce n'est pas une erreur 404. Link to comment Share on other sites More sharing options...
renaud2263 Posted May 18, 2016 Author Share Posted May 18, 2016 $tab->module = 'toto' ? Oui c'est le cas. Voici le constructeur de toto.php public function __construct() { $this->name = 'toto'; $this->tab = 'others'; $this->version = 1.0; $this->author = 'Renaud'; $this->need_instance = 0; parent::__construct(); $this->displayName = $this->l('Stats spéciales'); $this->description = $this->l('Weekly sales for invoices.'); } public function install() { // Création de l'onglet $tab = new Tab(); $tab->name[$this->context->language->id] = $this->l('Stats S-H'); $tab->class_name = 'AdminToto'; $tab->id_parent = 0; $tab->module = $this->name; $tab->add(); if (!parent::install()) return false; return true; } Link to comment Share on other sites More sharing options...
renaud2263 Posted May 18, 2016 Author Share Posted May 18, 2016 $this->tab = 'others'; il faut le changer a administration . Cela ne change rien. Mais peut-être faut-il que je désinstalle et réinstalle ? Link to comment Share on other sites More sharing options...
renaud2263 Posted May 18, 2016 Author Share Posted May 18, 2016 Hummm...je ne vois ces fonctions dans aucun ficher de module dans la 1.6.1. A quoi elles servent ? Comment je les appelle ? Link to comment Share on other sites More sharing options...
renaud2263 Posted May 18, 2016 Author Share Posted May 18, 2016 Ce qui donnerait ? public function install() { $this->createInnovativesLabsTabs(); } Link to comment Share on other sites More sharing options...
renaud2263 Posted May 18, 2016 Author Share Posted May 18, 2016 J'ai désinstallé, puis réinstallé avec tes fonctions. Pas de message install_succes mais ok, le lien apparait dans le menu. Par rapport à l'install classique, ça a rajouté une entrée dans la table PS_CONFIGURATION avec l'id de PS_TAB. Mais il ne trouve toujours pas ce p.... de controller qui pourtant est bien présent. C'est dingue ! Link to comment Share on other sites More sharing options...
renaud2263 Posted May 18, 2016 Author Share Posted May 18, 2016 Bah en fait je peux mettre n'importe quoi dans le fichier controller, rien ne change. Il n'est pas trouvé, pas lu, pas reconnu. J'ai même crée volontairement un parse_error dans le controller: rien ne bouge. J'ai passé le DEBUG à true. Nada. Est-ce qu'il y a une table qui n'a pas été renseignée ? Par exemple dans ps_module, le mien n'y est pas. Il est dans ps_tab, ps_tab_lang et c'est tout. Il est bien présent dans le fichier class_index du cache. Avec le bon chemin. Link to comment Share on other sites More sharing options...
erouvier29 Posted May 19, 2016 Share Posted May 19, 2016 Quelles différences (en particulier répertoires et noms de fichiers) avec le zip ci-joint, qui fonctionne pour moi dans un PS 1.6.1.5? Si il n'y en a pas, et que mon zip ne fonctionne pas, vérifiez si vous n'avez pas une surcharge de Dispatcher.php toto.zip Link to comment Share on other sites More sharing options...
renaud2263 Posted May 19, 2016 Author Share Posted May 19, 2016 Est ce que tu as creer le temple dans views/templates/admin/ ? J'ai mis un banal formulaire dans : views/templates/admin/helpers/form/form.tpl Link to comment Share on other sites More sharing options...
renaud2263 Posted May 19, 2016 Author Share Posted May 19, 2016 Quelles différences (en particulier répertoires et noms de fichiers) avec le zip ci-joint, qui fonctionne pour moi dans un PS 1.6.1.5? Si il n'y en a pas, et que mon zip ne fonctionne pas, vérifiez si vous n'avez pas une surcharge de Dispatcher.php toto.zip Bonjour, non aucune différence au niveau de la structure, noms de dossiers/fichiers. J'ai même essayé avec ton code "hello world" dans mon fichier controller. Toujours le même résultat: "Contrôleur introuvable". J'ai tenté un truc: dans le dossier modules/toto, j'ai changé toto.php en _toto.php. Aucun changement, pas d'erreur Presta. J'en déduis qu'une fois installé, et les entrées SQL générées, ce dossier toto dans modules ne sert plus à rien ? Je ne sais pas ce que signifie "vérifier la surcharge de Dispatcher.php" mais je vais creuser cette piste... Link to comment Share on other sites More sharing options...
erouvier29 Posted May 19, 2016 Share Posted May 19, 2016 C'est la classe Dispatcher qui a priori ne trouve pas le contrôleur et retourne le message d'erreur. Vérifier que: le fichier /classes/Dispatcher.php n'a pas été modifié (le comparer à le version originale dans la distrib PS) il n'y a pas de fichier /override/classes/Dispatcher.php qui surchargerait son comportement Link to comment Share on other sites More sharing options...
renaud2263 Posted May 19, 2016 Author Share Posted May 19, 2016 Aux deux points que tu évoques, la réponse est non. Saisi d'un doute à force d'installer et désinstaller mon module, J'ai uploadé et installé ton module "toto" tel quel dans les dossiers qui vont bien. Le résultat est exactement le même, c'est à devenir fou. Link to comment Share on other sites More sharing options...
erouvier29 Posted May 19, 2016 Share Posted May 19, 2016 Alors faut employer les grands moyens et insérer des points d'observation dans le code, à la condition que la boutique soit hors ligne ou en maintenance. Je commencerais par Dispatcher::dispatch(), à la ligne 314 en PS 1.6.1.5. Quel est le contenu du tableau $controllers? Link to comment Share on other sites More sharing options...
renaud2263 Posted May 19, 2016 Author Share Posted May 19, 2016 A la ligne 314, j'ai : $controllers = Dispatcher::getControllers(_PS_MODULE_DIR_.$tab->module.'/controllers/admin/'); Dessous, j'ajoute : Dispatcher::dispatch() Et: Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 65484 bytes) in classes/Dispatcher.php on line 259 La ligne 259 en question : $this->getController(); Link to comment Share on other sites More sharing options...
renaud2263 Posted May 19, 2016 Author Share Posted May 19, 2016 (edited) En lisant cette doc officielle: http://doc.prestashop.com/display/PS16/Configuration+des+menus+de+l'administration Et notamment : Module. Dans certains cas, le contrôleur d'administration pour lequel vous voulez créer une page vient d'un module. Dans ce cas, vous devez également indiquer l'identifiant de ce module (dans la plupart des cas, le nom de son dossier) et le copier dans le champ "Module", en caractères minuscules. Ainsi, PrestaShop saura qu'il ne doit pas chercher le contrôleur dans le dossier /controllers/admin, mais plutôt dans le dossier /modules/NOM-DU-MODULE/. Or moi, j'ai bien le module "toto" dans le dossier "modules"... Lorsque j'affiche la page de config des menus, je vois bien : 119 Test Renaud AdminToto toto Ce qui prouve que le module existe et qu'il a un ID (en effet 119 est dans la table tab). Autre observation: j'ai installé récemment un module "officiel" de chat online et ce dernier n'a pas de controller dans controller/admin. En revanche il a bien, dans son dossier module, un dossier "controllers/admin" dans lequel se trouve AdminOnlineChatController.php Il ne serait pas par là, le loup ??? Edited May 19, 2016 by renaud2263 (see edit history) Link to comment Share on other sites More sharing options...
renaud2263 Posted May 19, 2016 Author Share Posted May 19, 2016 Bingoooooooooooooooooooooooooooo !!!!!!!!!!!!!!!! J'ai crée un dossier controller/admin au sein du module, et dedans le controller.php. Et miracle ! Ton "Hello World" apparait ! Merci à vous, qui avez pris du temps pour me répondre et m'aider, c'est vraiment sympa ! Link to comment Share on other sites More sharing options...
erouvier29 Posted May 19, 2016 Share Posted May 19, 2016 J'ai crée un dossier controller/admin au sein du module, et dedans le controller.php. Je ne comprends pas. Ça n'était pas comme ça depuis le début? Pourtant: 5- Dans controllers/admin, le fichier AdminTotoController.php Quelles différences (en particulier répertoires et noms de fichiers) avec le zip ci-joint Bonjour, non aucune différence au niveau de la structure, noms de dossiers/fichiers. Et dans mon zip, il y a bien toto/controllers/admin/AdminTotoController.php... A la ligne 314, j'ai : $controllers = Dispatcher::getControllers(_PS_MODULE_DIR_.$tab->module.'/controllers/admin/'); Dessous, j'ajoute : Dispatcher::dispatch() Et: Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 65484 bytes) in classes/Dispatcher.php on line 259 La ligne 259 en question : $this->getController(); Il fallait mettre quelque chose comme die(var_dump($controllers)). Mais ce n'est plus la peine! Link to comment Share on other sites More sharing options...
renaud2263 Posted May 19, 2016 Author Share Posted May 19, 2016 A Ker Awen: Je n'ai peut-être pas été clair dans mon premier post. Mais le AdminTotoController.php était dans racine/controllers/admin et PAS dans modules/toto/controllers/admin d'où l'erreur. Désolé. A ndiaga: le nom de la classe n'a pas changé: AdminTotoController extends ModuleAdminController Link to comment Share on other sites More sharing options...
renaud2263 Posted May 19, 2016 Author Share Posted May 19, 2016 Merci à vous, les gars, c'est impec ! Je bute maintenant sur un autre problème, mais cela fera l'objet d'un nouveau sujet. Bonne soirée. 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