Перейти до вмісту
Пошук в
  • Детальніше...
Шукати результати, які ...
Шукати результати в ...

Ajax загрузка модулей из content_bottom (вопрос)


Recommended Posts

Всем привет, пытаюсь сделать ленивую загрузку модулей в Opencart 2.3.

 

На главной странице почти все модули выводятся через echo $content_bottom  и я пытаюсь сделать их загрузку по кнопке "Load". Вот что сделал:

 

В home.tpl убрал echo $content_bottom 

 

и написал следующий скрипт:

 

    modulesShown = false;

	$('#load').click(function(){ 
        if(!modulesShown){ 
            showModules();
            modulesShown=true; 
        } 
        function showModules () {
            $.ajax({ 
                url:"index.php?route=common/content_bottom/index",
                dataType:"html",
                success: function(e){

                  $("#modules").html(e);
                            
                }                
            });
        };
    });

То есть по моему замыслу все модули должны будут загрузится в див "modules" по нажатию на кнопку "Load"

Контроллер content_bottom.php у меня стандартный.

Вьюха content_bottom.tpl тоже

Если добавить print_r($modules); то каждый раз у меня возвращается пустой массив. В этом собственно и проблема.

 

Не могу понять почему он пустой.

 

Надіслати
Поділитися на інших сайтах


Потому что content_bottom как и остальные сайдбары ожидают входящих параметров. Исходя из которых грузят определенные модули.

В самом начале есть строка:

 

    if (isset($this->request->get['route'])) {
            $route = (string)$this->request->get['route'];
        } else {
            $route = 'common/home';
        }

 

Передавай значение route и остальные значения GET. в идеале и POST .а вдруг их какой-то модуль использует.

Змінено користувачем Igor123123
Надіслати
Поділитися на інших сайтах

2 часа назад, Igor123123 сказал:

Потому что content_bottom как и остальные сайдбары ожидают входящих параметров. Исходя из которых грузят определенные модули.

В самом начале есть строка:

 

    if (isset($this->request->get['route'])) {
            $route = (string)$this->request->get['route'];
        } else {
            $route = 'common/home';
        }

 

Передавай значение route и остальные значения GET. в идеале и POST .а вдруг их какой-то модуль использует.

А почему тогда без Ajax все работает? 

То есть смотрите если оставить в home строку echo $content_bottom, то она включает контроллер content_bottom , который в свою очередь возвращает вьюху return $this->load->view('common/content_bottom', $data); 

 

А в content_bottom.tpl функция:

 

<?php foreach ($modules as $module) { ?>
<?php echo $module; ?>
<?php }?>

И вот она без проблем выводит все модули которые отмечены в админке в разделе Дизайн.

 

Правильно ли я делаю что через ajax обращаюсь к функции Index контроллера content_bottom? 

 

 

Надіслати
Поділитися на інших сайтах


Еще раз повторюсь:

модули читаются тут: $modules = $this->model_design_layout->getLayoutModules($layout_id, 'content_bottom');
а $layout_id зависит от route:

        if (!$layout_id) {
            $layout_id = $this->model_design_layout->getLayout($route);
        }  

у тебя route =  common/content_bottom/index

 

для этого route нет layout. поэтому он берется тот что по умолчанию. А по умолчанию наверное нет назначенных модулей.

 

И да что того что-бы модули отображались, нужно return  $this->load->view('common/content_bottom', $data);

заменить на echo  $this->load->view('common/content_bottom', $data);

Но я бы сделал по другому:
Ничего не ламал и переделывал , а сделал бы отдельный контроллер и к нему обращался через ajax за всеми сайдбарами.

П.С. /index в конце не обязательно. Он и так вызывается

Надіслати
Поділитися на інших сайтах

вы немного неправильно воспринимаете схему взаимодействия

не echo $content_bottom включает контроллер,

а контроллер страницы продукта/категории/информационной/главной - да не важно какой,

обращается к контроллеру content_bottom, далее контроллер content_bottom увидев get параметры запроса определяет с какой страницы к нему обратились,

т.е продукта/категории/информационной/главной  или какой либо другой,

и получает из бд идентификаторы модулей именно для этой страницы,

затем обработав идентификатор он обращается к контроллеру каждого модуля,

которые в свою очередь собрав необходимые данные,

передают их в метод view выше вы уже писали про него,

и метод view обрабатывает эти данные загрузив необходимый tpl шаблон

таким образом если вам необходимо ajax подгрузка,

то как вариант можно переопределить контроллер content_bottom,

и вывести на страницу или в js переменную, или записать в инпут, или в атрибуты любого блока идентификаторы модулей что получил content_bottom.

затем посредством ajax передать данные идентификаторы обратно в контроллер, где обработав уже вернуть html

Змінено користувачем Pavel666
  • +1 1
Надіслати
Поділитися на інших сайтах

1 час назад, Pavel666 сказал:

вы немного неправильно воспринимаете схему взаимодействия

не echo $content_bottom включает контроллер,

а контроллер страницы продукта/категории/информационной/главной - да не важно какой,

обращается к контроллеру content_bottom, далее контроллер content_bottom увидев get параметры запроса определяет с какой страницы к нему обратились,

т.е продукта/категории/информационной/главной  или какой либо другой,

и получает из бд идентификаторы модулей именно для этой страницы,

затем обработав идентификатор он обращается к контроллеру каждого модуля,

которые в свою очередь собрав необходимые данные,

передают их в метод view выше вы уже писали про него,

и метод view обрабатывает эти данные загрузив необходимый tpl шаблон

таким образом если вам необходимо ajax подгрузка,

то как вариант можно переопределить контроллер content_bottom,

и вывести на страницу или в js переменную, или записать в инпут, или в атрибуты любого блока идентификаторы модулей что получил content_bottom.

затем посредством ajax передать данные идентификаторы обратно в контроллер, где обработав уже вернуть html

 

1 час назад, Igor123123 сказал:

Еще раз повторюсь:

модули читаются тут: $modules = $this->model_design_layout->getLayoutModules($layout_id, 'content_bottom');
а $layout_id зависит от route:

        if (!$layout_id) {
            $layout_id = $this->model_design_layout->getLayout($route);
        }  

у тебя route =  common/content_bottom/index

 

для этого route нет layout. поэтому он берется тот что по умолчанию. А по умолчанию наверное нет назначенных модулей.

 

И да что того что-бы модули отображались, нужно return  $this->load->view('common/content_bottom', $data);

заменить на echo  $this->load->view('common/content_bottom', $data);

Но я бы сделал по другому:
Ничего не ламал и переделывал , а сделал бы отдельный контроллер и к нему обращался через ajax за всеми сайдбарами.

П.С. /index в конце не обязательно. Он и так вызывается

 

Спасибо большое за разъяснение, теперь все стало понятно. В итоге сделал отдельную функцию, в ней указал роут по умолчанию common/home и все модули загрузились. :)

Надіслати
Поділитися на інших сайтах


Створіть аккаунт або увійдіть для коментування

Ви повинні бути користувачем, щоб залишити коментар

Створити обліковий запис

Зареєструйтеся для отримання облікового запису. Це просто!

Зареєструвати аккаунт

Вхід

Уже зареєстровані? Увійдіть тут.

Вхід зараз
  • Зараз на сторінці   0 користувачів

    • Ні користувачів, які переглядиють цю сторінку

×
×
  • Створити...

Important Information

На нашому сайті використовуються файли cookie і відбувається обробка деяких персональних даних користувачів, щоб поліпшити користувальницький інтерфейс. Щоб дізнатися для чого і які персональні дані ми обробляємо перейдіть за посиланням . Якщо Ви натиснете «Я даю згоду», це означає, що Ви розумієте і приймаєте всі умови, зазначені в цьому Повідомленні про конфіденційність.