Сделайте запрос 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 для использования