Устройство постраничной навигации d7
Классы для постраничной навигации:
- Класс
\Bitrix\Main\UI\PageNavigation
для простой навигации - Класс
\Bitrix\Main\UI\ReversePageNavigation
для обратной навигации - Класс
\Bitrix\Main\UI\AdminPageNavigation
для навигации в админке - Компонент
main.pagenavigation
с шаблонами .default (основан на round старого компонента), admin (для админки), modern (для гридов)
Постраничка поддерживает как параметры GET
, так и ЧПУ
. Теперь нужно явно указывать идентификатор навигации. Поддерживаются URL следующего вида, где nav-cars
и nav-books
идентификаторы двух разных постраничек на одной странице:
/page.php?nav-cars=page-5&nav-books=page-2&other=params
/page.php?nav-cars=page-5-size-20&nav-books=page-2
/page.php?nav-cars=page-all&nav-books=page-2
/dir/nav-cars/page-2/size-20/
/dir/nav-cars/page-all/?other=params
/dir/nav-cars/page-5/nav-books/page-2/size-10
Прямая постраничная навигация
<?
// фильтр
$filter = array("=IBLOCK_ID" => 6);
// прификс который добавится в URL
$nav = new \Bitrix\Main\UI\PageNavigation("nav-more-news");
// инициализация навигации
$nav->allowAllRecords(true)
// количество
->setPageSize(5)
// метод инициализирует навигацию от URI
->initFromUri();
// запрос в базу данных на d7
$newsList = \Bitrix\Iblock\ElementTable::getList(
array(
"filter" => $filter,
"count_total" => true,
"offset" => $nav->getOffset(),
"limit" => $nav->getLimit(),
)
);
// получаем число записей
$nav->setRecordCount($newsList->getCount());
// перебираем ответ
while ($news = $newsList->fetch()) {
pp($news);
}
?>
<?
$APPLICATION->IncludeComponent(
"bitrix:main.pagenavigation",
"",
array(
// передаем объект
"NAV_OBJECT" => $nav,
// включение/отключение ЧПУ или GET
"SEF_MODE" => "N",
),
false
);
?>
Обратная постраничная навигация
<?
// фильтр
$filter = array("=IBLOCK_ID" => 6);
// количество элементов, удовлитворяющих фильтр
$cnt = \Bitrix\Iblock\ElementTable::getCount($filter);
// прификс который добавится в URL и количество элементов
$nav = new \Bitrix\Main\UI\ReversePageNavigation("nav-news", $cnt);
// инициализация навигации
$nav->allowAllRecords(true)
// количество
->setPageSize(5)
// метод инициализирует навигацию от URI
->initFromUri();
// запрос в базу данных на d7
$newsList = \Bitrix\Iblock\ElementTable::getList(
array(
"filter" => $filter,
"offset" => $nav->getOffset(),
"limit" => $nav->getLimit(),
)
);
// перебираем ответ
while ($news = $newsList->fetch()) {
pp($news);
}
?>
<?
$APPLICATION->IncludeComponent(
"bitrix:main.pagenavigation",
"",
array(
// передаем объект
"NAV_OBJECT" => $nav,
// включение/отключение ЧПУ или GET
"SEF_MODE" => "N",
),
false
);
?>
Постраничная навигация без COUNT
<?
// фильтр
$filter = array("=IBLOCK_ID" => 6);
// прификс который добавится в URL
$nav = new \Bitrix\Main\UI\PageNavigation("nav-less-news");
// инициализация навигации
$nav->allowAllRecords(true)
// количество
->setPageSize(5)
// метод инициализирует навигацию от URI
->initFromUri();
// запрос в базу данных на d7
$newsList = \Bitrix\Iblock\ElementTable::getList(
array(
"filter" => $filter,
"offset" => ($offset = $nav->getOffset()),
"limit" => (($limit = $nav->getLimit()) > 0 ? $limit + 1 : 0),
)
);
// переменная для подсчета
$n = 0;
// перебираем ответ
while ($news = $newsList->fetch()) {
$n++;
if ($limit > 0 && $n > $limit) {
break;
}
}
// возврашает число записей
$nav->setRecordCount($offset + $n);
?>
<?
$APPLICATION->IncludeComponent(
"bitrix:main.pagenavigation",
"",
array(
// передаем объект
"NAV_OBJECT" => $nav,
// включение/отключение ЧПУ или GET
"SEF_MODE" => "Y",
// отключаем COUNT
"SHOW_COUNT" => "N",
),
false
);
?>