制作一个仅在 "onClick" 按钮上执行的挂钩
Make a hook to be executed only on "onClick" button
我有一个 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>
问题是钩子每页执行一次access/reload,我希望它只在单击按钮时执行。
挂钩仅在运行时执行,即 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>
此代码未经测试,应根据您的需要进行调整,但整体概念在这里。
我有一个 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>
问题是钩子每页执行一次access/reload,我希望它只在单击按钮时执行。
挂钩仅在运行时执行,即 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>
此代码未经测试,应根据您的需要进行调整,但整体概念在这里。