使用 ajax 调用 prestashop 模块
Call a prestashop module with ajax
我有一个名为 'MyMenu' 的 PrestaShop 模块,我想通过 AJAX 调用来调用此菜单。
我的模块显示在hookFooter()
方法中:
public function hookFooter()
{
$display = $this->display(__FILE__, 'megamenu.tpl', $smartyCacheId);
Tools::restoreCacheSettings();
return $display;
}
我想用这个脚本显示:
<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>
如果你不想通过模块传递url,js片段应该是这样的。
$(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)
}
});
});
其中 yourmodulename
是您的模块名称,yourfile.php
是您检索菜单的代码。
不要忘记将令牌添加到您的数据中,这是为了防止 CSFR 攻击,显然您还必须在服务器端脚本中检查令牌。
最好的方法是通过链接到您的模块的前端控制器来完成。
您可以这样调用 url :
$link->getModuleLink('modulename','controller', $parameters);
// Parameters is an optionnal array, it can be empty
对于控制器,放置一个这样的文件 ./modules/modulename/controllers/front/ajax.php,内容如下:
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');
}
}
在模块根目录的新文件中,您可以创建一个文件"ajax.php"
require_once(MODULE_DIR.'MyMenu/mymenu.php');
if(Tools::getValue('token') !=
$mymenu = Module::getInstanceByName('mymenu');
$menu = $mymenu->hookFooter();
die($menu);
在你的js中,在你模块的根目录下
<script>
$(document).ready(function (e) {
$.ajax({
method: "POST",
url: "./ajax.php",
data: {},
success: function (data) {
$('.load_menu').html(data);
}
})
});
</script>
我有一个名为 'MyMenu' 的 PrestaShop 模块,我想通过 AJAX 调用来调用此菜单。
我的模块显示在hookFooter()
方法中:
public function hookFooter()
{
$display = $this->display(__FILE__, 'megamenu.tpl', $smartyCacheId);
Tools::restoreCacheSettings();
return $display;
}
我想用这个脚本显示:
<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>
如果你不想通过模块传递url,js片段应该是这样的。
$(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)
}
});
});
其中 yourmodulename
是您的模块名称,yourfile.php
是您检索菜单的代码。
不要忘记将令牌添加到您的数据中,这是为了防止 CSFR 攻击,显然您还必须在服务器端脚本中检查令牌。
最好的方法是通过链接到您的模块的前端控制器来完成。 您可以这样调用 url :
$link->getModuleLink('modulename','controller', $parameters);
// Parameters is an optionnal array, it can be empty
对于控制器,放置一个这样的文件 ./modules/modulename/controllers/front/ajax.php,内容如下:
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');
}
}
在模块根目录的新文件中,您可以创建一个文件"ajax.php"
require_once(MODULE_DIR.'MyMenu/mymenu.php');
if(Tools::getValue('token') !=
$mymenu = Module::getInstanceByName('mymenu');
$menu = $mymenu->hookFooter();
die($menu);
在你的js中,在你模块的根目录下
<script>
$(document).ready(function (e) {
$.ajax({
method: "POST",
url: "./ajax.php",
data: {},
success: function (data) {
$('.load_menu').html(data);
}
})
});
</script>