Сделайте запрос ajax из модуля Prestashop

Я делаю модуль, и мне нужно сделать ajax-запрос, с JSON-ответом, если это возможно, как я могу это сделать? Я не очень хорошо понимаю структуру Prestashop 1.7 по этому вопросу.

Спасибо!

1 ответ

Решение

Это довольно просто, вам просто нужно сделать контроллер со стандартами Prestashop, а затем связать его с вашим Javascript-интерфейсом.

Назовите php-файл следующим образом: ./modules/modulename/controllers/front/ajax.php

Затем положите внутрь:

<?php

// Edit name and class according to your files, keep camelcase for class name.
require_once _PS_MODULE_DIR_.'modulename/modulename.php';

class ModuleNameAjaxModuleFrontController extends ModuleFrontController
{
    public function initContent()
    {

        $module = new ModuleName;

        // You may should do some security work here, like checking an hash from your module
        if (Tools::isSubmit('action')) {

            // Usefull vars derivated from getContext
            $context = Context::getContext();
            $cart = $context->cart;
            $cookie = $context->cookie;
            $customer = $context->customer;
            $id_lang = $cookie->id_lang;

            // Default response with translation from the module
            $response = array('status' => false, "message" => $module->l('Nothing here.'));

            switch (Tools::getValue('action')) {

                case 'action_name':

                    // Edit default response and do some work here
                    $response = array('status' => true, "message" => $module->l('It works !'));

                    break;

                default:
                    break;

            }
        }

        // Classic json response
        $json = Tools::jsonEncode($response);
        echo $json;
        die;

        // For displaying like any other use this method to assign and display your template placed in modules/modulename/views/template/front/...
        // Just put some vars in your template
        // $this->context->smarty->assign(array('var1'=>'value1'));
        // $this->setTemplate('template.tpl');

        // For sending a template in ajax use this method
        // $this->context->smarty->fetch('template.tpl');

    }
}

?>

В ваших модульных хуках вам нужно предоставить доступ к маршруту в JS, поэтому мы в основном делаем переменную:

// In your module PHP
public function hookFooter($params)
{

    // Create a link with the good path
    $link = new Link;
    $parameters = array("action" => "action_name");
    $ajax_link = $link->getModuleLink('modulename','controller', $parameters);

    Media::addJsDef(array(
        "ajax_link" => $ajax_link
    ));

}

Что касается внешнего интерфейса, вы просто называете это так в файле JS (с jQuery здесь):

// ajax_link has been set in hookfooter, this is the best way to do it
$(document).ready(function(){

    $.getJSON(ajax_link, {parameter1 : "value"}, function(data) {

        if(typeof data.status !== "undefined") {

            // Use your new datas here
            console.log(data);

        }

    });

});

И вуаля, у вас есть готовый контроллер AJAX для использования

Другие вопросы по тегам