По шагам:
- Создадим шаблон компонента постраничной навигации (bitrix:system.pagenavigation);
- Адаптируем шаблон компонента списка новостей (bitrix:news.list);
- Разместим на странице и настроим компонент (bitrix:news.list).
1. Создание шаблона постраничной навигации
Я покажу как сделать это вручную, но вы можете просто скопировать один из стандартных шаблонов и заменить в нем код на мой.
Для начала создадим раздел "system.pagenavigation" в шаблоне сайта: /bitrix/templates/[ваш шаблон]/components/bitrix/ или /local/templates/[ваш шаблон]/components/bitrix/. Если раздел уже существует (как в моём случае), новый создавать не надо:)
В нем создадим подраздел с названием нашего шаблона. Назовем его "show_more" (я буду использовать phpStorm, но те же действия можно проделатьс помощью других редакторов или админки Битрикс).
Каждый шаблон компонента должен содержать файл template.php, в нем будет храниться оформление. Также для реализации динамической подгрузки нам потребуются файлы script.js и style.css, где мы пропишем соответственно скрипт и стили.
Первым делом возьмемся за template:
<?
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
$this->createFrame()->begin("Загрузка навигации");
?>
<?if($arResult["NavPageCount"] > 1):?>
<?if ($arResult["NavPageNomer"]+1 <= $arResult["nEndPage"]):?>
<?
$plus = $arResult["NavPageNomer"]+1;
$url = $arResult["sUrlPathParams"] . "PAGEN_".$arResult["NavNum"]."=".$plus;
?>
<div class="load_more" data-url="<?=$url?>">
Показать еще
</div>
<?else:?>
<div class="load_more">
Загружено все
</div>
<?endif?>
<?endif?>
На первые две строки не обращаем внимание, в рамках этой статьи мы их рассматривать не будем.Дальше два условия: кнопка загрузки будет показываться когда страниц больше 1 и когда есть следующая страница (текущая + 1).
Кнопка будет представлять собой div с параметром data-url - адресом следующей станицы для подгрузки, классом load_more и надписью "Показать еще".
Читайте также: 7 смертных грехов разработки на 1С-Битрикс.
Если страницы постраничной навигации кончились - покажем надпись "Загружено все".
Следующий файл стилей. В нем будет оформление кнопки. Для примера я использовал простейшее оформление:
.load_more {
margin: 10px;
padding: 10px;
border: 1px solid #ddd;
cursor: pointer;
text-align: center;
}
В сумме со стилями моего сайта, кнопка будет выглядеть как в примере. Вы же оформите её как вам нравится:)Теперь самое главное - скрипт:
$(document).ready(function(){
$(document).on('click', '.load_more', function(){
var targetContainer = $('.news-list'), // Контейнер, в котором хранятся элементы
url = $('.load_more').attr('data-url'); // URL, из которого будем брать элементы
if (url !== undefined) {
$.ajax({
type: 'GET',
url: url,
dataType: 'html',
success: function(data){
// Удаляем старую навигацию
$('.load_more').remove();
var elements = $(data).find('.news-item'), // Ищем элементы
pagination = $(data).find('.load_more');// Ищем навигацию
targetContainer.append(elements); // Добавляем посты в конец контейнера
targetContainer.append(pagination); // добавляем навигацию следом
}
})
}
});
});
Как это работает: после нажатия на кнопку (div) срабатывает событие, отсылающее ajax запрос к указанному в кнопке адресу (атрибут data-id). Мы удаляем старую навигацию (класс .load_more), чтоб она не дублировалась. В полученных данных ищем элементы (в нашем случае класс .news-item, о нем чуть ниже) и уже известную нам навигацию (.load_more).Последним этапом работы скрипта, в контейнер .news-list (о нем тоже ниже) добавляем полученные элементы и навигацию.
2. Шаблон компонента списка новостей
Создадим папку шаблона компонента (/local/templates/[ваш шаблон]/components/bitrix/news.list/show_more_news/, либо /bitrix/templates/[ваш шаблон]/components/bitrix/news.list/show_more_news/).Шаблон будет состоять всего из одного файла template.php:
<?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();
$this->setFrameMode(true);
?>
<div class="news-list">
<?foreach($arResult["ITEMS"] as $arItem):?>
<?
$this->AddEditAction($arItem['ID'], $arItem['EDIT_LINK'], CIBlock::GetArrayByID($arItem["IBLOCK_ID"], "ELEMENT_EDIT"));
$this->AddDeleteAction($arItem['ID'], $arItem['DELETE_LINK'], CIBlock::GetArrayByID($arItem["IBLOCK_ID"], "ELEMENT_DELETE"), array("CONFIRM" => GetMessage('CT_BNL_ELEMENT_DELETE_CONFIRM')));
?>
<div id="<?=$this->GetEditAreaId($arItem['ID']);?>" class="news-item">
<a href="<?=$arItem["DETAIL_PAGE_URL"]?>">
<h2><?=$arItem["NAME"]?></h2>
</a>
<?=CFile::ShowImage($arItem['PREVIEW_PICTURE'])?>
<?=$arItem['PREVIEW_TEXT']?>
</div>
<?endforeach;?>
</div>
<?=$arResult['NAV_STRING']?>
Вообще, оформление вы можете использовать какое угодно. Важная деталь: все элементы должны быть обёрнуты в блок с классомnews-list, а каждый элемент иметь классnews-item (как в скрипте из второго пункта).
3. Размещение на странице и настройка компонента
На нужной странице размещаем компонент bitrix:news.list и настраиваем на необходимый инфоблок.В качестве шаблона компонента выбираем show_more_news (если вы все сделали правильно он должен появиться в списке), а в качестве шаблона постраничной навигации - show_more
И указываем нужное количество новостей на странице. Именно столько элементов будет подгружаться после нажатия на кнопку.
Еще раз пример того, что у меня получилось: gif (3.17 Mb).