Jump to content

Création module back office


Recommended Posts

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 by renaud2263 (see edit history)

Share this post


Link to post
Share on other sites

Précision:

Dans le fichier class_index.php j'ai bien :

 

 'AdminTotoController' =>
  array (
    'path' => 'controllers/admin/AdminTotoController.php',
    'type' => 'class',
    'override' => false,
  ),

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

$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;
    }

Share this post


Link to post
Share on other sites

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 !

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

attachicon.giftoto.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...

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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();

Share this post


Link to post
Share on other sites

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 by renaud2263 (see edit history)

Share this post


Link to post
Share on other sites

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 !

Share this post


Link to post
Share on other sites

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!

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
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
 Share

×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More