Далее приведен код рабочего примера для пагинации битрикса в HighloadBlock (хайлоад блоках).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
//Дополнительная фукнция для HLB // подключаем пространство имен класса HighloadBlockTable и даём ему псевдоним HLBT для удобной работы use Bitrix\Highloadblock\HighloadBlockTable as HLBT; //подключаем модуль highloadblock CModule::IncludeModule('highloadblock'); //Напишем функцию получения экземпляра класса: function GetEntityDataClass($HlBlockId) { if (empty($HlBlockId) || $HlBlockId < 1) { return false; } $hlblock = HLBT::getById($HlBlockId)->fetch(); $entity = HLBT::compileEntity($hlblock); $entity_data_class = $entity->getDataClass(); return $entity_data_class; } $count_notice=2;//количество в одном выводе. $id_hl_block=2; // id Highloadblock // создаем объект пагинации $nav = new \Bitrix\Main\UI\PageNavigation("nav-more-notice"); $nav->allowAllRecords(true) ->setPageSize($count_notice) ->initFromUri(); //определяем арфильтр $arFilter = Array( "UF_ID_USER"=>$id_user , ); // создаем объект класса для работы с hiloadlbock $entity_data_class = GetEntityDataClass($id_hl_block); $rsData = $entity_data_class::getList(array( 'select' => array('*'), "count_total" => true, //хз - читайте в документации "offset" => $nav->getOffset(), //из объекта пагинации добавляем смещение для HighloadBlock "limit" => $nav->getLimit(), //здесь лимит из Объекта пагинации 'filter' => $arFilter, )); // засовываем общее количество записей в объект пагинации, перед выбором нужных объектов $nav->setRecordCount($rsData->getCount()); while($el = $rsData->fetch()){ ?> <div class="block_notice"> <p class="notice_title"><?php echo $el['UF_TITLE']; ?></p> <p class="notice_message"><?php echo $el['UF_MESSAGE']; ?></p> <p class="notice_time"><?php echo $el['UF_TIME']; ?></p> </div> <?php } $APPLICATION->IncludeComponent("bitrix:main.pagenavigation", "", Array( "NAV_OBJECT" => $nav, "SEF_MODE" => "N" ), false ); |
Теперь по порядку. Ничего фантастического и мистического в коде нет.
1. что мы сделали это подключили Highloadblock модуль и написали чудо функцию, которая будет возвращать экземпляр объекта класса, для работы хайлоадблоками ))).
2. Настроили пагинацию. Настройка вытекает из следующих соображений.
Если брать sql запрос к таблице
1 2 3 4 |
SELECT * FROM таблица ORDER BY ... LIMIT { номер } OFFSET номер |
То для выставления , какая страница сейчас загружена нам нужно
а) Количество записей в запросе
б) Limit- количество на странице
в) OFFSET смещение от начальной страницы. Начальная страница — смещение 0.
Пункт а) — Нам нужен что бы не сместиться на несуществующую страницу пагинации.
Наши действия.
3.создаем объект пагинации $nav ,
4.выставляем внутри его id (будет передаваться get запросом) =nav-more-notice
5. берем getList и засовываем в его параметры offzet и limit
6. командой
1 |
$nav->setRecordCount($rsData->getCount()); |
помещаем количество строк запроса в объект пагинации .
7. Выводим что нам нужно через команду fetch
8. Выводим саму пагинацию и радуемся!!!
1 2 3 4 5 6 |
$APPLICATION->IncludeComponent("bitrix:main.pagenavigation", "", Array( "NAV_OBJECT" => $nav, "SEF_MODE" => "N" ), false ); |