Автоподгрузка записей типа контента

+20
3.1K
В рамках работы над одним проектом понадобилась Автоподгрузка записей типа контента при прокрутке.
Оформил разработку в виде отдельного компонента, который подключается в шаблоне списка записей типа контента.
И делюсь им.

Что это

Иллюстрация

Обычная автоподгрузка записей. Работает в двух режимах — по клику и автоматически. В месте размещения выводится кнопка, клик по которой подгрузит ниже записи со следующей страницы

Кнопка (и стили и скрипты) выводятся следующим кодом

  1. <?php
  2. if($total > $page * $perpage){
  3. $this->renderControllerChild('zloading','button',[
  4. ]);
  5. }
  6. ?>
Этот код надо разместить в файле списка записей (например, default_list.tpl.php или сделать копию этого файла и назвать типконтента_list.tpl.php, чтобы использовать автоподгрузку только в одном типе контента) ДО кода вывода пагинации

  1. <?php echo html_pagebar($page, $perpage, $total, $page_url, array_merge($filters, $ext_hidden_params)); ?>

Автоматическая подгрузка

Если нужен режим автоматической подгрузки, то нужно добавить параметр вот так

  1. <?php
  2. if($total > $page * $perpage){
  3. $this->renderControllerChild('zloading','button',[
  4. 'auto' => true
  5. ]);
  6. }
  7. ?>
тогда новые записи будут подгружать автоматически при прокрутке.

Демо

Испытать в работе можно тут

Ограничения

Автор захотел сделать еще один велосипед на IntersectionObserver и сознательно не использовать сторонних библиотек автоподгрузки. Настаивать на их использовании бесполезно.
Компонент предоставляется как есть, бесплатно. Автор не несет никакой ответственности.
Компонент не пишет ничего в базу. Поэтому для удаления просто удалите файлы компонента.
Предназначен только для шаблона modern (и дочерних)

Вебмастерам

После подгрузки очередной страницы вызывается событие icms_zloading_loaded. Вы можете использовать его, чтобы переинициализировать скрипты во вновь подгруженных записях. Пример использования события есть в templates/modern/controllers/zloading/button.tpl.php

Где взять

В списке файлов моего профиля /users/1009/files.html
Последняя актуальная версия на момент написания zloading20210103_1.0.0 /users/files/download7785.html
Там же всегда будет последняя актуальная версия разработки, если обновления таки будут.

Обратите внимание! В архиве для примера находится файл templates/modern/content/news_list.tpl.php с включенным в него кодом для вывода автоподгрузки. Этот шаблон применится к типу контента news, если таковой есть. Вы можете удалить этот файл или переименовать. Или не копировать при установке.
-9
Алексей Т Алексей Т 3 года назад #
Это конечно супер что Вам заказали и Вы сделали. 97% разработок тут так и появляются. Упакуйте в готовое решение. Люди будут покупать кому надо.
Дай тут что то то бесплатно -Но рассказав как это сделать что бы заработало- это для тех кто что бы попробовать. На реальных проектах вряд ли люди будут ставить. Соберите по человечески - выставите счет например я бы купил за 600 руб.+ сделайте описание+ оформите в каталог дополнений.
+3
Zau4man Zau4man 3 года назад #
Это готовое решение. Осталось только подсказать компоненту, где его ждут, разместив в шаблоне небольшой кусок кода.

Я думал сделать виджетом, но виджет не знает про пагинацию. Можно грузить все скрипты при каждом вызове виджета, искать пагинацию, и если есть пагинация, запускать код в работу. Мне такой вариант не подходит.

Сделать решение универсальным для всех не получится. У всех разные поля, из коробки будут работать только поля без интерактива. Например, не получится так подгрузить яндекс карту, нужно будет немного танцев. И т.п.
0
Def Def 3 года назад #
Было бы отлично после прочтения записи типа контента, чтобы подгружалась следующая, как сейчас на многих контентных новостных сайтах.
Это тоже отличное дополнение!
+2
Zau4man Zau4man 3 года назад #
чтобы подгружалась следующая
нельзя сделать универсальное решение. Ну или я не могу сделать это. Скрипты, подгруженные ajaxом, должны быть адаптированы к тому, чтобы сработать на вновь показанных записях и др.

Сделать под конкретный сайт и набор полей в принципе можно.
+1
Василич Василич 3 года назад #
У вас есть на это время? Сделать для актуального шаблона, для обычного типа контента(например новости), грузить после комментов и пары виджетов и в конце написать маленькую инструкцию, чтоб можно было переделывать под свои нужды.
Если есть время, сколько будет стоить данная разработка?
Спасибо.
+2
Zau4man Zau4man 3 года назад #
Я посмотрю, как будет время.
Интересно, удастся ли "завести" комментарии у подгруженных записей.
+1
Zau4man Zau4man 3 года назад #
Комментарии "завести" не удалось. Там совпадают идентификаторы, надо править шаблоны.
Пока получилось так

Gifка на 2.5мб, ахтунг
Завтра постараюсь сделать живое демо.
+1
T34 T34 3 года назад #
Потыкался в демо, и вот что думаю можно доработать. чтоб при скроле в верх также подгружались записи. Для чего всё это, докрутил я до 2й страницы перешёл в запись -> почитал нажал назад и попадаю на 2 страницу, то есть верхних записей нет, а если надо... smile
-2
DeDja DeDja 3 года назад #
Изложенное Вами весьма приемлемо и не ново.

Смотреть:
/forum/thread18939-1.html
/blogs/bitblog/modul-avtopodgruzki-stranic-dlja-instantcms-2-x.html

Небольшая демка с модулем от Val на моём стареньком демо сайте - http://xyz-nk.ru/activity
0
T34 T34 3 года назад #
Изложенное Вами весьма приемлемо и не ново.
Я в курсе что такое есть и практикуется в отдельных сторонних библиотек.
0
livecom livecom 3 года назад #
И было бы здорово, если что-то подобное сделать для контента в записях. Например, при достижении определенного количества знаков, появляется кнопка "Читать дальше".
+4
Scythian Scythian 3 года назад #
Zau4man, спасибо большое за безвозмездно предоставленное полезное дополнение! v
+1
Сергей Сергей 3 года назад #
Поддержу Scythian. Тоже, спасибо большое Zau4man
0
F_a_R_i_D F_a_R_i_D 3 года назад #
Нужная вещь, спасибо!
Но без пагинации было бы лучше.
+2
Zau4man Zau4man 3 года назад #
Вы можете скрыть ее стилями.
Без пагинации не получится узнать ссылку на следующую страницу.
0
kolecha kolecha 2 года назад #
Подскажите, чем заменить $this->addBottom(ob_get_clean()) для старой версии движка?
+1
Zau4man Zau4man 2 года назад #
Удалите эту строку и строку "ob_start()" в начале блока <script>
Без них скрипт вставится в месте вывода - должно работать.
0
kolecha kolecha 2 года назад #
Согласен, не догодался.
Не грузится:
Uncaught TypeError: icms.menu.initSwipe is not a function

Но работало, когда загружалась часть страницы(до "Показать еще") с ошибкой из-за $this->addBottom(ob_get_clean()).
+2
Zau4man Zau4man 2 года назад #
Найдите и удалите этот код

Код JS:
  1. icms.events.on('icms_zloading_loaded', function () {
  2. icms.menu.initSwipe($('.info_bar').not('.slick-initialized'), {variableWidth: true});
  3. });
в файле templates/шаблон/controllers/zloading/button.tpl.php
0
kolecha kolecha 2 года назад #
подправил для себя, код работает...
но проверил что DATA возвращается только заголовок с наборами без списка. поэтому и фильтровать нечего
0
kolecha kolecha 2 года назад #
Проблема при выводе нескольких наборов, с одни работает. С несколькими выводит только заголовок и сами наборы.

<h1>Заголовок</h1>
<div class="content_datasets">
<ul class="pills-menu">
<li></li>
...
<li></li>
</ul>
</div>
0
Def Def 2 года назад #
а в связях тоже работает эта опия? заметил, что многие забывают о связях и не адаптируют под них, в связи с чем там просто показывается бывает кнопка для загрузки, но не загружает новые записи.
+1
Zau4man Zau4man 2 года назад #
Не проверял, связями не пользуюсь.
Предположу, что в связях в виде вкладки работать будет, а в виде списка - нет.
0
Def Def 2 года назад #
жалько, связи очень полезный инструмент когда им правильно пользуешься.
0
noname noname 2 года назад #

После установки файла в настройках Типа контента пропадает выбор «Стиль списка по умолчанию», 2.14.2 ... 

+1
Loadырь Loadырь 2 года назад #

Всё верно. Ведь вы же назвали файл ваштипконтента_list.tpl.php, а не default_list_ваштипконтента.tpl.php. Когда есть файл ваштипконтента_list.tpl.php, всегда будет работать только он, поэтому сам факт выбора стиля не нужен.

0
noname noname 2 года назад #

Удалил с пакета news_list.tpl.php, в default_list_tiles.tpl.php (плитка) в 121 строку прописал код «Автоматическая подгрузка», работает. Всем спасибо !
 

0
noname noname 2 года назад #

Добрый. Если добавить прокрутку для default_list_tiles.tpl, то pagebar уезжает на футер 

0
Def Def 2 года назад #

А в связях работает корректно? Если выведено 20 записей через связи, то они работать будут корректно?

+1
Zau4man Zau4man 2 года назад #

Не знаю. Не люблю связи, не пользуюсь ими.

0
Happy Happy 1 год назад #

на 2.15.1  модерн работает не корректно. один раз подгружает и дальше не хочет.

на дочерних шаблонах вообще автоподгрузка не работает а ручная подгрузка кнопка не исчезает даже если дальше нет контента

+1
Zau4man Zau4man 1 год назад #

2.15.1 demo.bergorod.ru/news

Только что еще раз проделал описанное в записи. Все работает… Смотрите ошибки в консоли браузера.

0
Александр Сергеевич Александр Сергеевич 1 год назад #

А как-то влияет это на поисковика? Поисковик попадёт к записям не первой страницы?

+1
Zau4man Zau4man 1 год назад #

Попадет.

Ссылки в блоке списка страниц никуда не деваются.

+1
Capitan Capitan 1 год назад #

Все работает! Все Ок!

Еще от автора

Готовый сайт лендинг компании по подбору персонала
Делал два года назад. Заказчик сменил профиль и сайт не пригодился.
Выведем контент группы в списке полей группы
Поле позволяет в списке полей группы вывести последний контент этой группы.
Чиним реферальные ссылки биллинга при закрытом сайте
Проблема такая: если сайт закрыт, то при переходе по реферальной ссылке типа /r/1 пользователя перехватывает компонент Авторизация, и хук биллинга, ко
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.