Вызов модуля prestashop с помощью ajax

У меня есть модуль PrestaShop под названием «MyMenu», и я хочу вызвать это меню с помощью вызова AJAX. Мой модуль отображается в методе hookFooter():

public function hookFooter()
{
    $display = $this->display(__FILE__, 'megamenu.tpl', $smartyCacheId);
    Tools::restoreCacheSettings();
    return  $display;
}

Я хочу отображать этот скрипт:

<div class="load_menu"></div>
<script>
    $(document).ready(function (e) {
        $.ajax({
            method: "POST",
            url: "../modules/MyMenu.php",
            data: {},
            success: function (data) {
                $('.load_menu').html(data);
            }
        })
    });
</script>

person Community    schedule 21.03.2017    source источник
comment
Какая версия prestashop? 1,6?   -  person marsaldev    schedule 21.03.2017
comment
Версия 1.7.0.2   -  person    schedule 21.03.2017


Ответы (3)


В новом файле в корне модуля вы можете создать файл «ajax.php»

require_once(MODULE_DIR.'MyMenu/mymenu.php');
if(Tools::getValue('token') !=
$mymenu = Module::getInstanceByName('mymenu');
$menu = $mymenu->hookFooter();
die($menu);

В вашем js в корне вашего модуля

<script>
$(document).ready(function (e) {
    $.ajax({
        method: "POST",
        url: "./ajax.php",
        data: {},
        success: function (data) {
            $('.load_menu').html(data);
        }
    })
});
</script>
person tarek fellah    schedule 21.03.2017
comment
Ошибка синтаксиса PHP (require_one ...), и это не соответствует стандартам Prestashop. - person Matt Loye; 18.10.2018
comment
он просто неправильно писать, это явно функция require_once () - person Gabriele Carbonai; 18.11.2018
comment
@MattLoye Вы должны добавить эти строки в свой ответ, чтобы быть правильным, вы следовали за созданием контроллера ajax Pestashop, но вы не ответили на вопрос, основной ответ здесь require_once (MODULE_DIR.'MyMenu / mymenu.php '); $ mymenu = Module :: getInstanceByName ('mymenu'); $ menu = $ mymenu- ›hookFooter (); - person tarek fellah; 19.11.2018

Лучше всего сделать это через передний контроллер, подключенный к вашему модулю. Вы можете вызвать URL-адрес следующим образом:

$link->getModuleLink('modulename','controller', $parameters);
// Parameters is an optionnal array, it can be empty

А для контроллера поместите такой файл ./modules/modulename/controllers/front/ajax.php с таким содержимым:

class ModuleNameAjaxModuleFrontController extends ModuleFrontController
{
public function initContent()
{

    $response = array('status' => false);

    require_once _PS_MODULE_DIR_.'modulename/modulename.php';

    $module = new ModuleName;

    if (Tools::isSubmit('action')) {
        $context = Context::getContext();

        $cart = $context->cart;

        switch (Tools::getValue('action')) {

            case 'actionname':


                $response = array('status' => true);

                break;

            default:
                break;

        }
    }

    // Classic json response
    $json = Tools::jsonEncode($response);
    $this->ajaxDie($json);

    // For displaying like any other use this method to assign and display your template placed in modules/modulename/views/template/front/...
    // $this->context->smarty->assign(array('var1'=>'value1'));
    // $this->setTemplate('template.tpl');

    // For sending a template in ajax use this method
    // $this->context->smarty->fetch('template.tpl');

}
}
person Matt Loye    schedule 21.03.2017
comment
+1 за это. Всегда используйте контроллеры, также вместо echo Tools::jsonEncode($response); die; вы можете использовать $this->ajaxDie(Tools::jsonEncode($response)), поскольку этот метод также выполняет два перехватчика перед выводом ajax в случае каких-либо модулей, использующих перехватчики. - person TheDrot; 21.03.2017
comment
Верно и, возможно, раньше инкапсулирует jsonEncode. Я отредактирую свой ответ. - person Matt Loye; 21.03.2017
comment
Я не понимаю, как использовать этот метод для вызова меню, которое должно отображаться без вызова .. почему if (Tools :: isSubmit ('action'))? - person ; 21.03.2017
comment
Вы можете удалить эту часть, это должно было сделать метод обработки ajax с некоторой гибкостью ... Вы должны получить добычу в части классов в файлах Prestashop. - person Matt Loye; 21.03.2017
comment
Также проверьте validator.prestashop.com, есть генератор модулей, вам будет проще понять, как сделать модуль в Prestashop таким образом. - person Matt Loye; 22.03.2017
comment
@MattLoye require_once должен вызываться перед объявлением класса, вы не получили содержимое модуля перехвата для его отображения при успешном вызове ajax, поэтому вы использовали только контроллер для выполнения вызова ajax, который ничего не делает, хорошего дня - person tarek fellah; 19.11.2018

Если вы не хотите передавать URL-адрес модулем, фрагмент js должен быть таким.

$(document).ready(function(){
    $.ajax({
        type: "POST", 
        headers: { "cache-control": "no-cache" },
        url : baseDir + 'modules/yourmodulename/yourfile.php',
        data: {
            token : token
        },
        success : function(data){
            $('.load-menu').html(data)
        }
    });
});

Где yourmodulename - это имя вашего модуля, а yourfile.php - это код, из которого вы получаете меню.

Не забудьте добавить к своим данным токен, чтобы предотвратить CSFR-атаку, очевидно, что вам также нужно проверить токен в скрипте на стороне сервера.

person marsaldev    schedule 21.03.2017