Bitrix. Ajax подгрузка элементов через «Показать еще»

Подгрузка элементов через кастомный компонент с параметрами «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»

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *