Подгрузка элементов через кастомный компонент с параметрами «offset» и «pageSize». Не через пагинацию.
Создаем компонент. В component.php:
$pageSize = !empty((int)$arParams['pageSize']) ? (int)$arParams['pageSize'] : 8;
$offset = !empty((int)$arParams['offset']) ? (int)$arParams['offset'] : 0;
$res = CIBlockElement::GetList(
["ID" => "ASC"],
["IBLOCK_ID" => 1, "ACTIVE" => "Y"],
false,
[
"nTopCount" => $pageSize + 1,
"nOffset" => $offset
],
["ID", "NAME"]
);
$count = 0;
while ($item = $res->GetNext()) {
$count++;
if ($count <= $pageSize) {
$arResult['ITEMS'][] = $item;
}
}
$arResult['HAS_MORE'] = ($count > $pageSize);Для чего мы добавляем в $pageSize плюс один. Чтобы понять, нужно ли нам показывать кнопку «Показать еще», мы запрашиваем на один элемент больше.
В шаблоне «…/templates/.default/template.php» выводим элементы:
<div class="wrap_list_items">
<div class="list_items">
<?php foreach ($arResult['ITEMS'] as $item): ?>
<div class="item"><?php echo $item['NAME']?></div>
<?php endforeach; ?>
</div>
<?php if ($arResult['HAS_MORE']) : ?>
<a class="link_more_cta" href="#" id="items_more_cta" data-offset="<?=((int)$arParams['offset']+(int)$arParams['pageSize']);?>" data-cnt="<?=(int)$arParams['pageSize']?>" data-url="/local/components/mycomp/news.list/ajax.php">Показать еще</a>
<?php endif; ?>
</div>В файле js «…/templates/.default/script.js»:
var load_more = false;
$(document).on("click", "#items_more_cta", function(e) {
e.preventDefault();
if (load_more)
return false;
load_more = true;
$.ajax({
url: $(this).attr('data-url'),
type: "POST",
data: {
offset: $(this).attr('data-offset'),
pageSize: $(this).attr('data-cnt')
},
success: function(data) {
$('#items_more_cta').parent().remove();
$('.wrap_list_items').append(data);
load_more = false;
}
});
});В файле ajax.php:
<?php require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");
/** @global CMain $APPLICATION */
define("NO_KEEP_STATISTIC", true);
define('PUBLIC_AJAX_MODE', true);
define("NOT_CHECK_PERMISSIONS", true);
use Bitrix\Main\Application,
Bitrix\Main\Context;
$request = Context::getCurrent()->getRequest();
$POST = $request->getPostList()->toArray();
//$APPLICATION->ShowAjaxHead();
$APPLICATION->IncludeComponent(
"mycomp:news.list",
"",
[
"offset" => $POST['offset'],
"pageSize" => $POST['pageSize'],
]
);Это пример. В коде есть ошибки. Например этот ajax скрипт добавит в класс «wrap_list_items» еще один «wrap_list_items». Возможно стоит добавить параметр и завернуть код в шаблоне в:
if ($arParams["IS_AJAX"] == "Y") {
$APPLICATION->RestartBuffer();
}
// код
if ($arParams["IS_AJAX"] == "Y") {
die();
}PS. А лучше всего использовать D7 и через «BX.ajax.runComponentAction»