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

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

21.03.2017 02:11:29 Просмотров 47 Источник

У меня есть модуль 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>
У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/42925427/call-a-prestashop-module-with-ajax#comment72948329_42925427
Какая версия движка? 1.6?
https://stackoverflow.com/questions/42925427/call-a-prestashop-module-with-ajax#comment72962545_42925427
Версия 1.7.0.2

Ответы - Вызов модуля prestashop с помощью ajax / Call a prestashop module with ajax

sarcom

21.03.2017 02:27:26

Если вы не хотите передавать 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, очевидно, вам также нужно проверить токен в вашем скрипте на стороне сервера.

Matt Loye

21.03.2017 02:35:41

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

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

И для контроллера, поместите файл, как это ./модули/модуль/контроллер/передний/Аякс.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');

}
}
https://stackoverflow.com/questions/42925427/call-a-prestashop-module-with-ajax/42925987#comment72952981_42925987
+1 за это. Всегда используйте контроллеры, а также echo Tools::jsonEncode($response); die; вы можете использовать $this->ajaxDie(Tools::jsonEncode($response)) так что метод также выполняет два крючка, прежде чем Аякс выход в случае каких-либо модулей, используя крючки.
https://stackoverflow.com/questions/42925427/call-a-prestashop-module-with-ajax/42925987#comment72954847_42925987
True и, возможно, инкапсулирует jsonEncode раньше. Я собираюсь отредактировать свой ответ.
https://stackoverflow.com/questions/42925427/call-a-prestashop-module-with-ajax/42925987#comment72963249_42925987
Я не понимаю, как использовать этот метод, чтобы вызвать меню, которое должно отображаться без вызова.. почему " если (инструменты::isSubmit('действие')) "?
https://stackoverflow.com/questions/42925427/call-a-prestashop-module-with-ajax/42925987#comment72965078_42925987
Вы можете удалить эту часть, чтобы сделать метод обработки ajax с некоторой гибкостью ... Вам придется взять бабло у части классов в Prestashop файлах.
https://stackoverflow.com/questions/42925427/call-a-prestashop-module-with-ajax/42925987#comment73003124_42925987
Кроме того, вы должны проверить validator.prestashop.com , есть генератор модулей, вам будет легче понять, как сделать модуль в Prestashop таким образом.
https://stackoverflow.com/questions/42925427/call-a-prestashop-module-with-ajax/42925987#comment93634679_42925987
@MattLoye require_once должен быть вызван перед объявлением класса, вы не получили содержимое модуля hook, чтобы отобразить его при успешном вызове ajax, поэтому вы использовали только контроллер для вызова ajax, который ничего не делает, хорошего дня
Является ответом!
tarek fellah

21.03.2017 03:23:22

В новом файле в корне модуля можно создать файл " ajax.РНР"

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>
https://stackoverflow.com/questions/42925427/call-a-prestashop-module-with-ajax/42927063#comment92656907_42927063
Существует ошибка синтаксиса PHP (require_one ...) и это не соответствует стандартам Prestashop.
https://stackoverflow.com/questions/42925427/call-a-prestashop-module-with-ajax/42927063#comment93601183_42927063
он просто неправильно пишет, это очевидно require_once() функция
https://stackoverflow.com/questions/42925427/call-a-prestashop-module-with-ajax/42927063#comment93634921_42927063
@MattLoye вы должны добавить эти строки в свой ответ, чтобы быть правильным, вы следили за созданием контроллера pestashop ajax, но вы не ответили на вопрос, основной ответ здесь require_once(MODULE_DIR.'MyMenu / mymenu.на PHP'); $mymenu = модуль::getInstanceByName('mymenu'); $меню = $mymenu->hookFooter();
Закрыть X