2016-11-28 11 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: метод создания продукта находится на функции hook. Функция hook находится в файле php. Единственный способ вызвать функцию из файла php в файл tpl - использовать hook. Нет? – 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, no? В противном случае, файл tpl не может видеть нашу функцию js. – androniennn

+1

Файл Js добавлен в функцию «hookHeader» внутри нашего модуля. –

+0

А я помещал его в функцию 'hookBackOfficeHeader'. Другой вопрос, пожалуйста, нужно ли мне создавать разные файлы ajax для каждой функции, которую я хочу добавить? – androniennn

 Смежные вопросы

  • Нет связанных вопросов^_^