N'hésitez pas à me le signaler si nécessaire via le formulaire de contact.
J’ai perdu dernièrement pas mal de temps en tentant de mettre en place des appels ajax dans la configuration d’un module Prestashop version 1.5.
Les méthodologies qui fonctionnent très bien avec les dernières version de prestashop ne fonctionnaient pas du tout.
Après analyse du code, il s’avère que la gestion des requêtes ajax pour les modules prestashop telle que nous la connaissons n’est pas implémentée pour les versions inférieures à la version 1.6.0.3
Pour corriger cela, il est nécessaire de surcharger la fonction postProcess de la classe AdminController.
Pour faire cela proprement il faut donc créer un override dans le fichier :
override/classes/controller/AdminController.php
avec le contenu suivant :
( j’ai tout simplement repris celui des dernières version )
<?php class AdminController extends AdminControllerCore { /** * @todo uses redirectAdmin only if !$this->ajax */ public function postProcess() { if ($this->ajax) { // from ajax-tab.php $action = Tools::getValue('action'); // no need to use displayConf() here if (!empty($action) && method_exists($this, 'ajaxProcess' . Tools::toCamelCase($action))) return $this->{'ajaxProcess' . Tools::toCamelCase($action)}(); //Rajout du code pour pouvoir gérer les actions ajax des modules elseif (!empty($action) && $this->controller_name == 'AdminModules' && Tools::getIsset('configure')) { $module_obj = Module::getInstanceByName(Tools::getValue('configure')); if (Validate::isLoadedObject($module_obj) && method_exists($module_obj, 'ajaxProcess' . $action)) return $module_obj->{'ajaxProcess' . $action}(); } //Fin Rajout du code pour pouvoir gérer les actions ajax des modules elseif (method_exists($this, 'ajaxProcess')) { echo 'Appel de la finction ajax process des modules'; return $this->ajaxProcess(); } } else { // Process list filtering if ($this->filter) $this->processFilter(); // If the method named after the action exists, call "before" hooks, then call action method, then call "after" hooks if (!empty($this->action) && method_exists($this, 'process' . ucfirst(Tools::toCamelCase($this->action)))) { // Hook before action Hook::exec('actionAdmin' . ucfirst($this->action) . 'Before', array('controller' => $this)); Hook::exec('action' . get_class($this) . ucfirst($this->action) . 'Before', array('controller' => $this)); // Call process $return = $this->{'process' . Tools::toCamelCase($this->action)}(); // Hook After Action Hook::exec('actionAdmin' . ucfirst($this->action) . 'After', array('controller' => $this, 'return' => $return)); Hook::exec('action' . get_class($this) . ucfirst($this->action) . 'After', array('controller' => $this, 'return' => $return)); return $return; } } } } |
Une fois l’override en place vous pourrez effectuer des requêtes ajax facilement dans l’administration de votre module.
Voici un code qui pourra vous servir de canevas :
<?php if (!defined('_PS_VERSION_')) exit; class adminajax extends Module { public function __construct() { $this->name = 'adminajax'; $this->tab = 'others'; $this->author = 'hhennes'; $this->version = '0.1.0'; $this->need_instance = 0; parent::__construct(); $this->displayName = $this->l('Admin ajax'); $this->description = $this->l('Sample module for admin ajax'); } public function install() { return parent::install(); } public function uninstall() { return parent::uninstall(); } /** * Configuration du module */ public function getContent() { $output = 'Test admin ajax sur les différentes version de Prestashop'; $output .= '<script> $(document).ready(function(){ $.ajax({ url : "'.$this->context->link->getAdminLink('AdminModules').'&configure='.$this->name.'", data : { ajax : true, action : "Test", }, success : function(msg){ alert(msg); }, error : function(msg){ console.log("erreur"); console.log(msg); } }); }); </script>'; return $output; } /** * Actions Ajax du modules */ public function ajaxProcessTest() { echo 'Action ajax effectuée proprement :-)'; } } |
Hey, ça tombe bien, je vais bientôt devoir développer un module qui utilise de l’ajax. Merci.