2016-11-28 55 views
1

我有一個Prestashop模塊,並且我想在單擊按鈕時執行鉤子(插入產品)。 下面是我在做什麼現在:使鉤子僅在「onClick」按鈕上執行

在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

而不是調用掛鉤,你應該調用該方法來創建一個產品,它會爲你調用鉤子。 – TheDrot

+0

@TheDrot:創建產品的方法是掛鉤功能。鉤子函數在php文件中。從php文件到tpl文件調用函數的唯一方法是使用鉤子。沒有? – androniennn

+1

那麼你做錯了,因爲在創建產品後,鉤子將用於做一些額外的事情**。 – TheDrot

回答

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> 

此代碼是不是測試,應該可以適應您的需求,但整體的概念在這裏。

+0

我們應該將對js文件的引用添加到tpl文件中,否?否則,tpl文件無法看到我們的js函數。 – androniennn

+1

Js文件被添加到模塊中的「hookHeader」函數中。 –

+0

啊,我把它放在'hookBackOfficeHeader'函數中。其他問題,請讓我爲每個我想添加的函數創建不同的ajax文件? – androniennn