我有一个Prestashop模块,我想在点击一个按钮时执行一个钩子(插入一个产品)。 这就是我现在正在做的事情:
在module.php文件中,我使用此功能:
public function hookActionProductAdd()
{
//code to create a product
}
在module.tpl文件中我创建了一个按钮,它的onClick执行钩子:
<button onclick="createProduct()">Create product</button>
在tpl文件的末尾,我添加了脚本代码:
<script>
function createProduct() {
{hook h='ActionProductAdd'}
}
</script>
问题是每次访问/重新加载时都会执行钩子,我希望它只在单击按钮时执行。
答案 0 :(得分:4)
只有在Prestashop生成模板文件时才会在运行时执行钩子。在这里,您需要在模块中创建一个ajax函数。
您的模块文件如下所示:
- mymodule.php
- ajax/
- my_module_ajax.php
- js/
- my_module.js
- views/
- templates/
- front/
- my_module_template.tpl
在文件mymodule.php
中,您已获得:
<?php
if (!defined('_PS_VERSION_'))
exit;
class MyModule extends Module
{
public function __construct()
{
[...]
}
public function install()
{
if (!parent::install() || !$this->registerHook('header'))
return false;
return true;
}
public function hookHeader($params)
{
$this->context->controller->addJS(($this->_path).'js/my_module.js');
}
public function _ajax_create_product($params)
{
[...]
return $result;
}
}
在文件my_module_ajax.php
中,您已获得:
<?php
require_once(dirname(__FILE__).'/../../../config/config.inc.php');
require_once(dirname(__FILE__).'/../../../init.php');
require_once(dirname(__FILE__).'/../mymodule.php');
$context = Context::getContext();
// Instance of module class
$module = new MyModule();
switch (Tools::getValue('action'))
{
case 'createProduct':
echo $module->_ajax_create_product(Tools::getValue('test'));
break;
default:
die('error');
}
在文件my_module.js
中,您已获得:
$(document).ready(function(){
$(document).on('click', '#myButton', function(){
createProduct('a_value');
});
});
function createProduct(value) {
$.ajax({
type: 'GET',
url: baseDir + 'modules/mymodule/ajax/my_module_ajax.php?rand=' + new Date().getTime(),
headers: { "cache-control": "no-cache" },
async: true,
cache: false,
data: 'action=createProduct&value=' + value+ '&other=' + 'test',
success: function(data)
{
console.log("product created");
}
});
}
在文件my_module_template.tpl
中,您已获得:
<button id="myButton" name="myButton">Create product!</button>
此代码未经过测试,应根据您的需求进行调整,但整体概念就在这里。