Jump to content

Enrutamiento de llamadas Ajax Prestashop1.7


ruthcast

Recommended Posts

Hola a todos de nuevo, he desarrollado un módulo que muestra una tabla de productos en una plantilla.tpl desde un hook, estoy intentando crearle filtros personalizados, debido a que no logre ajustar los de búsqueda por facetas que trae prestashop 1.7 al diseño en modo de tabla que realicé,  para ello he intentado hacer una llamada ajax desde la plantilla a un controlador frontal en mi modulo que ejecutará una consulta a la bd y me devolverá un resultado para mostrar en la plantilla, pero hasta el momento no he logado obtener una respuesta 200 del servidor.

Para ello he hecho lo siguiente.

En el archivo principal.php del módulo he creado la url de la siguiente forma:

public function hookHeader(){
      $link = new Link;
        $ajax_link = $link->getModuleLink('tablaLlantas','TablallantasAjax');
        Media::addJsDef(array(
            "ajax_link" => $ajax_link
        ));
}

He creado un controlador para el ajax.php en la ruta modules/nameModule/controller/front/ajax.php:

Que solo para probar lleva el siguiente código:

require_once(dirname(__FILE__).'../../../../config/config.inc.php');
require_once(dirname(__FILE__).'../../../../init.php');
require_once _PS_MODULE_DIR_.'tablaLlantas/tablaLlantas.php';

class TablallantasAjaxModuleFrontController extends ModuleFrontController
{
    public function initContent()

    {   $module = new TablaLlantas;
        $this->ajax = true;
        
        parent::initContent();
        if (Tools::isSubmit('action')) {
            $context = Context::getContext();

            // Default response with translation from the module

            $response = array('status' => false, "message" => $module->l('Nothing here.'));

            switch (Tools::getValue('action')) {
                case 'action_name':
                  
                    $response = array('status' => true, "message" => $module->l('It works !'));
                    break;
                default:
                    break;
            }
        }
         // Classic json response
         $json = Tools::jsonEncode($response);
         echo $json;
         die;
    }
}

y en la platilla tpl ubicada en la ruta modules/tablaLlantas/views/templates/hook la cual esta asociada el hook que estoy mostrando he usado el siguiente código:

 function llamadaAjax(){
            $("#marcaSelect option:selected").each(function() {
                $.getJSON(ajax_link, {parameter1 : "value"}, function(data) {
                    if(typeof data.status !== "undefined") {
                        // Use your new datas here
                    console.log(data);
                    }
                });
            });
        };

 

también he intentado crear un archivo ajax.php en la raíz del directorio y nada. Siempre me da una respuesta 404. No logro entender la estructura de prestashop1.7 para enrutar correctamente la llamada Ajax. Si alguien puede ayudarme se lo agradecería mucho. Estoy con la versión prestashop 1.7

Link to comment
Share on other sites

hace 4 horas, ruthcast dijo:

@gusman126 tendrás alguna idea al respecto?😫

Las llamadas AJAX no tengo experiencia en llamadas a controladores, siempre uso JavaScript y llamadas a ficheros independientes PHP.

No te puedo decir cómo hacer la llamada a una orden AJAX de un controlador o un módulo.

En la documentación de PrestaShop sí que hay algo de información

Link to comment
Share on other sites

Hola a ver lo que te puedo decir a primera vista

1 - Lo primero es que la ruta del controller es  con s controllers

2 - Luego todos esos archivos que llamas en el controller no los necesitas

puedes probar el controller levanta con algo tan simple que consultandolo en tu browser (claro si pruebas un get )

tutienda.com/index.php?fc=module&module=TUMODULO&controller=ajax

y si quieres desde seo lo buscas y le creas un friendly asi te aseguras que prestashop te lee el controller

3 Ahora la llamada historicamente la hago asi sin problema asi

 

        $.ajax({
            type: 'POST',
            url: prestashop.urls.base_url  + 'index.php?fc=module&module=yourmodule&controller=ajax' ,
            headers: { "cache-control": "no-cache" },
            dataType: 'json',
            data: 	{
                        ajax: true,
						// Otros valores aqui
                    }  ,
            success: function(response) {
              // AQUI 
        },
        error: function(response) {

          // ERROR AQUI
            },
        });

 

  • Like 1
Link to comment
Share on other sites

Hola gracias por tu respuesta. Lo resolví hace algunos días con un archivo ajax.php en la raíz del directorio del modulo al cual llamé mediante ajax con esta ruta index.php/ajax.php y funcionó. No se si según PS sea lo mas óptimo pero funcionó. 

Link to comment
Share on other sites

Hay módulos que lo hacen como comentas, con un archivo ajax.php directamente en el directorio raíz del módulo o en alguno de sus subdirectorios, así que dudo que esa solución dé ningún problema.

Aunque el método "oficial" sería como  creo que lo estabas intentando al principio y como te ha  recomendado jgamio, declarar el controlador como tal dentro de la inicialización del módulo y luego colocar ahí la gestión de las peticiones AJAX.

Pero si ya te funciona como lo tienes, ni lo toques, que no merece la pena complicarse.

 

Edited by Prestafan33 (see edit history)
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...