制作一个仅在 "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>

此代码未经测试,应根据您的需要进行调整,但整体概念在这里。