Разбивает запрос на несколько страниц.
Как в Битриксе при помощи API сформировать пагинацию
Делаем всю задачу по шагам:
1. Создаем первые переменные:
$count = ($_GET['count']) ? $_GET['count'] : 5; $page = ($_GET['page']) ? $_GET['page'] : 1;
2. Находим общее количество по заданному фильтру:
// search if ($_GET['s']) { $arFilterS = array( "LOGIC" => "OR", $arFilter + array('NAME' => '%'.trim($_GET['s']).'%'), $arFilter + array('PROPERTY_ARTNUMBER' => '%'.trim($_GET['s']).'%'), ); $arFilter = $arFilterS; } $allCnt = CIBlockElement::GetList ( Array("ID" => "DESC"), $arFilter, [], [], false ); $arResult['ALL_COUNT'] = $allCnt; $arResult['PAGE_COUNT'] = $count; $my_elements = CIBlockElement::GetList ( Array("ID" => "DESC"), $arFilter, false, Array( 'nPageSize' => $count, 'nTopCount' => false, 'iNumPage' => $page, 'checkOutOfRange' => true ), Array('ID', 'NAME', 'PROPERTY_ARTNUMBER', 'DATE_CREATE', 'CATALOG_PRICE_1') ); while ($arItem = $my_elements->GetNext()) { $arResult['ITEMS'][] = $arItem; }
3. Пишем HTML
<div class="nav-footer"> <?if ($arResult['ALL_COUNT'] > $arResult['PAGE_COUNT']) {?> <? $perPage = ceil($arResult['ALL_COUNT'] / $arResult['PAGE_COUNT']); for ($i=1; $i <= $perPage; $i++) {?> <?if ($i != $_GET['page']) {?> <a class="nav-item" href="?page=<?=$i?>&count=<?=$_GET['count']?>&s=<?=$_GET['s']?>"><?=$i?></a> <?} else {?> <span class="nav-item"><?=$i?></span> <?}?> <?}?> <?}?> </div>
‘checkOutOfRange’ => true – не даст нам зациклиться
Давайте еще раз, самый важный участок кода для разбиения запроса вот:
Array( 'nPageSize' => $count, 'nTopCount' => false, 'iNumPage' => $page, 'checkOutOfRange' => true ),
Код можно улучшить, обработав соответствующим образом переменные, поменять тип массива _GET на _REQUEST и т.д. Но важнее понять, как именно разбивать в наших компонентах весь массив, и отсекать лишнее на уровне запроса а не “иф \ элс” 🙂