AlexisC Posted May 6, 2015 Share Posted May 6, 2015 (edited) Bonjour, Je viens de passer quelques heures à essayer de trouver une solution mais en vain. J'ai lu quelques topics concernant ce que je suis en train de faire, mais ça ne semble pas fonctionner. Concernant ma demande, J'ai crée un module pour afficher un nouvel onglet sur l'ajout/l'édition des produits. Pour le moment tout va bien.Maintenant, sur ce nouvel onglet, j'effectue une requête ajax pour aller rechercher des produits. Le hic, est que prestashop me retourne "controller introuvable" alors que tout me semble correct. Voici mon arbo : Voici la fonction qui affiche le contenu de mon onglet : public function hookDisplayAdminProductsExtra($params) { $this->context->smarty->assign( array( 'label_product' => $this->l('Product: '), 'module_link' => $this->context->link->getAdminLink('AdminAlexiscAutoAddProduct'), ) ); return $this->display(__FILE__, 'alexiscautoaddproduct.tpl'); } Et voici ma requête ajax : $.ajax({ type: 'POST', url: '{$module_link}', dataType: 'json', data: { controller : 'AdminAlexiscAutoAddProduct', action : 'refreshProducts', ajax : true }, success: function(data) { } }); Voici le contenu de mon controller qui est censé réceptionner ces requetes ajax : class AdminAlexiscAutoAddProductController extends ModuleAdminController{ public function ajaxProcessRefreshProducts($product_name) { echo 'a';die; } } Merci pour votre aide, je sêche un peu et je ne trouve rien sur la doc du fonctionnement de l'appel des controller pour un module :/ Edited May 6, 2015 by AlexisC (see edit history) Link to comment Share on other sites More sharing options...
herve25 Posted May 6, 2015 Share Posted May 6, 2015 Bonjour, Pour commencer il faudrait que tu vérifie ce qu'il y'a dans la variable {$module_link} Essaye d'ouvrir ce lien dans ton navigateur pour voir si il renvoie déjà une page, cela te donnera déjà une indication si ton lien est bon ou si c'est une autre erreur. Link to comment Share on other sites More sharing options...
AlexisC Posted May 6, 2015 Author Share Posted May 6, 2015 (edited) Voici le contenu de mon url : ...admin/index.php?controller=AdminAlexiscAutoAddProduct&token=1cf16429663df0648b7bb70b339b27cf Edited May 6, 2015 by AlexisC (see edit history) Link to comment Share on other sites More sharing options...
herve25 Posted May 6, 2015 Share Posted May 6, 2015 Le lien de base du controller à l'air bon.Il faudrait que tu récupère la requête ajax qui est réalisée ( via l'onglet console de firebug par exemple ) et que tu débugue directement cette url. Link to comment Share on other sites More sharing options...
AlexisC Posted May 7, 2015 Author Share Posted May 7, 2015 Tout me semble correct coté ajax Link to comment Share on other sites More sharing options...
herve25 Posted May 7, 2015 Share Posted May 7, 2015 Et si tu change le nom de ta fonction ajaxProcessRefreshProducts par displayAjaxRefreshProducts Link to comment Share on other sites More sharing options...
AlexisC Posted May 7, 2015 Author Share Posted May 7, 2015 (edited) Salut Herve ! Non plus, ça ne fonctionne pas :/ Edited May 7, 2015 by AlexisC (see edit history) Link to comment Share on other sites More sharing options...
AlexisC Posted May 7, 2015 Author Share Posted May 7, 2015 Bon j'ai un peu creuser le code source et j'en suis arrivé à cette conclusion : Il essaye de trouver le controller dans les dossiers suivants : /admin/tabs/ /controllers/admin/ /override/controllers/admin/ Du coup ma question est : Pourquoi il essaye de trouver le controller dans ces dossiers et pas dans le dossier de mon module ? /modules/alexiscautoaddproduct/controllers/admin/Merci Link to comment Share on other sites More sharing options...
Lactor Posted May 7, 2015 Share Posted May 7, 2015 Bonjour, Je ne sais pas si ça doit jouer beaucoup ou pas, mais je crois que ton nom de controller n'est pas conforme... Tu étends ModuleAdminController, mais ce n'est pas dit dans ton controller, du coup il ne le voit pas... Essaie adminalexiscautoaddproductModuleAdminController (extends ModuleAdminController toujours) plutôt. Et je pense que tu peux le raccourcir un peu, du genre alexisautoaddproductModuleAdminController, vu que admin y est deux fois sinon ^^' Tiens-nous au courant, Cordialement, Lactor Link to comment Share on other sites More sharing options...
herve25 Posted May 7, 2015 Share Posted May 7, 2015 J'ai trouvé un contournement qui permets de faire marcher le controller ajax. Il faut que tu ajoute un menu dans l'administration.Avec en classe le nom de ta classe controller ( sans controller ) Et dans le champ module le nom de ton module. Ensuite ta requête ajax fonctionnera.Comme tu peux le voir dans le code https://github.com/PrestaShop/PrestaShop/blob/1.6.0.14/classes/Dispatcher.php ( ligne 306 )Le dispatcher recherche une tab pour ton module, et seulement dans ce cas il ira chercher les fichiers situés dans tonmodule/controllers/admin/ ( ligne 324 ) Après le mieux sera de créer cet tab directement lors de l'installation. Link to comment Share on other sites More sharing options...
AlexisC Posted May 7, 2015 Author Share Posted May 7, 2015 Oui c'est ce que je me suis rendu compte.. Mais ce que je ne comprends pas c'est pourquoi sur certains tuto ça semble fonctionner ?Et du coup, si je ne crée pas de tab, comment dois-je au final faire pour faire ma requête ajax... ? Enfin il y a bien une autre façon de faire peut être ? Link to comment Share on other sites More sharing options...
herve25 Posted May 8, 2015 Share Posted May 8, 2015 Je n'ai malheureusement pas trouvé d'autre contournement propre pour l'instant. Link to comment Share on other sites More sharing options...
AlexisC Posted May 11, 2015 Author Share Posted May 11, 2015 (edited) Merci pour vos réponses. J'ai rédigé un petit tuto (vite fait) pour ceux que ça pourrait intéresser PrestaShop : Requête ajax via module (par AlexisC/Ghostaunt) Pour effectuer une requête ajax sur un module il existe deux façons différents. Pour ce tutoriel, nous allons nous serveur de cette configuration : 1 - Contrôleur principal (module sans tab/onglet) Si le module ne dispose pas de tab/d’onglet il faut faire pointer nos requêtes AJAX sur le contrôleur principal de notre module. Dans cet exemple, il faut pointer sur le fichier modules/alexiscautoaddproduct/alexcautoaddproduct.php Dans ce fichier il faut créer la méthode qui va réceptionner notre requête AJAX. Si par exemple, notre méthode s’appelle “test”, il faut la nommer en utilisant cette convention : ajaxProccessTest() { … } Ensuite, il faut générer et utiliser l’url pour nos requêtes AJAX : $this->context->link->getAdminLink('AdminModules') . '&configure=' . $this->name Pour terminer, voici la requête AJAX : $.ajax({ type: 'POST', url: '{$module_link}', dataType: 'json', data: { action : 'Test', ajax : true }, success: function(data) { } }); 2 - Utiliser les controlleurs admin/front du module (avec tab/onglet) Cet exemple, plus propre à mon sens, permet d’exploiter les différentes contrôleurs que l’on peut être amené à créer dans le module dans les dossiers controllers/admin ou controllers/front. Néanmoins il nécessite à ce que le module est un onglet dans l’administration de Prestashop. En effet, PrestaShop n’exploitera ces contrôleurs que si le module dispose d’un onglet dans l’administration (va savoir pourquoi…) Dans cet exemple, nous devons pointer notre requete sur un contrôleur perso : modules/alexiscautoaddproduct/controllers/[admin/front]/AdminAlexiscAutoAddProduct.php Pour générer le lien : $this->context->link->getAdminLink('AdminAlexiscAutoAddProduct') Requête Ajax : $.ajax({ type: 'POST', url: '{$module_link}', dataType: 'json', data: { controller : 'AdminAlexiscAutoAddProduct', action : 'Test', ajax : true }, success: function(data) { } }); Edited May 11, 2015 by AlexisC (see edit history) 1 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