设置一个钩子只能在" onClick"按键

时间:2016-11-28 17:58:17

标签: hook prestashop prestashop-1.6

我有一个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>

问题是每次访问/重新加载时都会执行钩子,我希望它只在单击按钮时执行。

1 个答案:

答案 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>

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