Tengo un módulo de PrestaShop llamado 'MyMenu' y quiero llamar a este menú con una llamada AJAX. Mi módulo se muestra en el método hookFooter() :
public function hookFooter() { $display = $this->display(__FILE__, 'megamenu.tpl', $smartyCacheId); Tools::restoreCacheSettings(); return $display; }Quiero mostrar con este script:
<div class="load_menu"></div> <script> $(document).ready(function (e) { $.ajax({ method: "POST", url: "../modules/MyMenu.php", data: {}, success: function (data) { $('.load_menu').html(data); } }) }); </script>La mejor manera es hacerlo a través de un controlador frontal conectado a su módulo. Puedes llamar a la url así:
$link->getModuleLink('modulename','controller', $parameters); // Parameters is an optionnal array, it can be emptyY para el controlador, coloque un archivo como este ./modules/modulename/controllers/front/ajax.php con este tipo de contenido:
class ModuleNameAjaxModuleFrontController extends ModuleFrontController { public function initContent() { $response = array('status' => false); require_once _PS_MODULE_DIR_.'modulename/modulename.php'; $module = new ModuleName; if (Tools::isSubmit('action')) { $context = Context::getContext(); $cart = $context->cart; switch (Tools::getValue('action')) { case 'actionname': $response = array('status' => true); break; default: break; } } // Classic json response $json = Tools::jsonEncode($response); $this->ajaxDie($json); // For displaying like any other use this method to assign and display your template placed in modules/modulename/views/template/front/... // $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'); } }Si no desea pasar la URL por el módulo, el fragmento js debería ser así.
$(document).ready(function(){ $.ajax({ type: "POST", headers: { "cache-control": "no-cache" }, url : baseDir + 'modules/yourmodulename/yourfile.php', data: { token : token }, success : function(data){ $('.load-menu').html(data) } }); }); Donde yourmodulename es el nombre de su módulo y yourfile.php es el código donde recupera el menú.
No olvide agregar a sus datos el token, es para evitar un ataque CSFR, obviamente también debe verificar el token en el script del lado del servidor.
En un nuevo archivo en la raíz del módulo, puede crear un archivo "ajax.php"
require_once(MODULE_DIR.'MyMenu/mymenu.php'); if(Tools::getValue('token') != $mymenu = Module::getInstanceByName('mymenu'); $menu = $mymenu->hookFooter(); die($menu);En tu js, en la raíz de tu módulo.
<script> $(document).ready(function (e) { $.ajax({ method: "POST", url: "./ajax.php", data: {}, success: function (data) { $('.load_menu').html(data); } }) }); </script>