Prestashop 1.5 : Requête ajax dans la configuration d’un module

Ce tutoriel est compatible avec les versions de Prestashop suivantes :
1.5 1.7.8 8.1 +
Cet article est assez ancien, malgré toute l'attention que j' apporte à mes contenus il est possible que celui-ci ne soit plus d'actualité.
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 :-)'; 
 } 
}

1 réflexion sur “Prestashop 1.5 : Requête ajax dans la configuration d’un module”

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *