Jump to content

Requête Ajax à partir d'un module ?


Recommended Posts

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 : 

8ce93a5bdf.png

 

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 by AlexisC (see edit history)
Link to comment
Share on other sites

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

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

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

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

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

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 :

dm0CK.jpg

 

 

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 by AlexisC (see edit history)
  • Thanks 1
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...