Постраничная навигация в списке разделов Битрикс- catalog.section.list

Просмотров: 13039

Если в магазине очень много разделов и хочется вывести их с постраничной навигацией: можно воспользоваться методами CDBResult::IsNavPrint(), CDBResult::NavStart и CDBResult::NavPrint

CDBResult::IsNavPrint()

Метод возвращает false, если все записи умещаются в одну страницу. В противном случае true. Он поможет нам ограничить колличество выводимых разделов на одной странице.

CDBResult::NavStart и CDBResult::NavPrint

Метод CDBResult::NavPrint выводит ссылки для постраничной навигации. Перед использованием данного метода необходимо вызвать метод NavStart. С помощью этих методов выведем, собственно, постраничную навигацию в catalog.section.list

Реализуем навигацию в catalog.section.list

Итак: Имеем некий интернет-магазин, в каталоге которого есть разделы с большим количеством подразделов. В моем случае, может доходить до 100-а подразделов, в каждом разделе. Кроме того, на сайте выводится не просто список подразделов: Картинка, Название, Пользовательское поле UF_ (в моем случае страна, но это не принципиально)

В итоге, если выводить на страницу все 100 разделов- страница получается невообразимо длинной. Нужно ограничить количество подразделов по 20 на страницу и добавить постраничную навигацию по остальным.

Всю работу выполняем со стандартным шаблоном списка разделов (catalog.section.list), внутри комплексного шаблона каталога. Хотя, само собой, можно проделывать это и не в комплексном шаблоне.

Просто в template.php вставляем этот код:

<?
$rs = new CDBResult;
$rs->InitFromArray($arResult['SECTIONS']);
$rs->NavStart(3);
if ($rs->IsNavPrint()) {
    while ($arSection = $rs->Fetch()) {
        $db_list = CIBlockSection::GetList(
            false,
            $arFilter = array(
                "IBLOCK_ID" => $arSection["IBLOCK_ID"],
                "ID" => $arSection["ID"]
            ),
            true
        );
        ?>
<li>
  <a href="<?= $arSection["SECTION_PAGE_URL"] ?>">
  <?=$arSection['NAME']?>
  </a>
  </li>

       <?
    }
    $rs->NavPrint("Подразделы", false, "pn_text");
} ?>

До цикла while

  • Подключили класс CDBResult - для работы с постраничной навигацией
  • Использовали метод InitFromArray для заполнения массива (в нашем случае, количеством разделов)
  • Вызвали метод NavStart - в котором указали количество разделов, которое хотим выводить на одной странице
  • Методом IsNavPrint - определяем, помещается ли количество разделов на одну страницу (меньше ли 20-ти)

В самом цикле, просто получили пользовательское поле UF_STRANA и завернули в ссылку на раздел все нужные данные: картинку, название и название страны (в моем случае).

После цикла while, собственно, вывели постраничную навигацию. Метод NavPrint имеет следующие параметры:

  • title Названия выводимых элементов.
  • show_always Если "false", то метод не будет выводить навигационные ссылки если все записи умещаются на одну страницу. Если "true", то ссылки для постраничной навигации будут выводиться всегда. По умолчанию - "false".

По сути, самый главный параметр в NavPrint - это последний, указание пути к шаблону с навигацией. Можете указать false- если устраивает стандартный шаблон. Но, можете указать полный путь к своему шаблону. Например "/local/templates/navp.php"

Sky 10.11.2019
Михаил,большое спасибо за метод! Все работает! Небольшие два вопроса:
1.Как использовать стандартную пагинацию скажем "round" шаблон?
2.Как разметить ее над списком, а если возможно и под ним тоже ?
Гость 07.04.2023
Михаил, если переключиться на вторую страницу, а затем в URL убрать ?PAGEN_1=2 и перезагрузить страницу, то отображаются разделы второй страницы. Можно это как-то пофиксить (чтобы сбрасывалось обратно на первую страницу)?
Михаил Базаров 08.04.2023
Цитата
Гость написал:
Михаил, если переключиться на вторую страницу, а затем в URL убрать ?PAGEN_1=2 и перезагрузить страницу, то отображаются разделы второй страницы. Можно это как-то пофиксить (чтобы сбрасывалось обратно на первую страницу)?

Спасибо за донат. Но проблему не смог воспроизвести, в заметке чуть чуть поправил код - убрал лишнее.
Видео: https://www.youtube.com/watch?v=acQHmc75Yb4
Гость 08.04.2023
Это, наверное, потому что я использовал метод GetPageNavStringEx (чтобы можно было подключить свой шаблон вывода постраничной навигации), у меня ajax запросом PAGEN_1=* подгружаются страницы и после перезагрузки страницы остаётся именно та страница, которая была подгружена последняя. Может есть какое-то решение использовать свой шаблон навигации?
Гость 08.04.2023
Проблема решена. Нужно было указать нулевое время кеширования страниц обратной навигации в методе (у меня было null вместо 0).

Может кому-то пригодится:

<?=$rs->GetPageNavStringEx($navComponentObject, '', '.default', false, 0);?>
Гость 05.07.2023
Не могу подключить шабон bootstrap что можно сделать?
Указал
$rs->NavPrint("Подразделы", false, "", '/bitrix/templates/government_default/components/bitrix/syste­m.pagenavigation/bootstrap_new/template.php');

Ругается на  $this->setFrameMode(true);
Михаил Базаров 05.07.2023
Целиком ошибку напишите. Вообще это  $this->setFrameMode(true); отвечает за композитный режим
Гость 05.07.2023
Тут скрин


Если закоментить $this->setFrameMode(true);то ошибки нет, и пагинации тоже)
Гость 05.07.2023
Цитата
написал:
Целиком ошибку напишите. Вообще это  $this->setFrameMode(true); отвечает за композитный режим

Код
[Error] 
Call to undefined method CDBResult::setFrameMode() (0)
C:\OpenServer\domains\local.tourism.loc\bitrix\templates\government_default\components\bitrix\system.pagenavigation\bootstrap_new\template.php:17
#0: include
   C:\OpenServer\domains\local.tourism.loc\bitrix\modules\main\classes\general\database.php:799
#1: CAllDBResult->GetNavPrint
   C:\OpenServer\domains\local.tourism.loc\bitrix\modules\main\classes\general\database.php:697
#2: CAllDBResult->NavPrint
   C:\OpenServer\domains\local.tourism.loc\bitrix\templates\government_default\components\bitrix\catalog.section.list\cards_galery\template.php:26
#3: include(string)
   C:\OpenServer\domains\local.tourism.loc\bitrix\modules\main\classes\general\component_template.php:790
#4: CBitrixComponentTemplate->__IncludePHPTemplate
   C:\OpenServer\domains\local.tourism.loc\bitrix\modules\main\classes\general\component_template.php:885
#5: CBitrixComponentTemplate->IncludeTemplate
   C:\OpenServer\domains\local.tourism.loc\bitrix\modules\main\classes\general\component.php:776
#6: CBitrixComponent->showComponentTemplate
   C:\OpenServer\domains\local.tourism.loc\bitrix\modules\main\classes\general\component.php:716
#7: CBitrixComponent->includeComponentTemplate
   C:\OpenServer\domains\local.tourism.loc\bitrix\components\bitrix\catalog.section.list\component.php:538
#8: include(string)
   C:\OpenServer\domains\local.tourism.loc\bitrix\modules\main\classes\general\component.php:607
#9: CBitrixComponent->__includeComponent
   C:\OpenServer\domains\local.tourism.loc\bitrix\modules\main\classes\general\component.php:684
#10: CBitrixComponent->includeComponent
   C:\OpenServer\domains\local.tourism.loc\bitrix\modules\main\classes\general\main.php:1072
#11: CAllMain->IncludeComponent
   C:\OpenServer\domains\local.tourism.loc\bitrix\templates\government_default\components\bitrix\news\galery_new\news.php:78
#12: include(string)
   C:\OpenServer\domains\local.tourism.loc\bitrix\modules\main\classes\general\component_template.php:790
#13: CBitrixComponentTemplate->__IncludePHPTemplate
   C:\OpenServer\domains\local.tourism.loc\bitrix\modules\main\classes\general\component_template.php:885
#14: CBitrixComponentTemplate->IncludeTemplate
   C:\OpenServer\domains\local.tourism.loc\bitrix\modules\main\classes\general\component.php:776
#15: CBitrixComponent->showComponentTemplate
   C:\OpenServer\domains\local.tourism.loc\bitrix\modules\main\classes\general\component.php:716
#16: CBitrixComponent->includeComponentTemplate
   C:\OpenServer\domains\local.tourism.loc\bitrix\components\bitrix\news\component.php:336
#17: include(string)
   C:\OpenServer\domains\local.tourism.loc\bitrix\modules\main\classes\general\component.php:607
#18: CBitrixComponent->__includeComponent
   C:\OpenServer\domains\local.tourism.loc\bitrix\modules\main\classes\general\component.php:684
#19: CBitrixComponent->includeComponent
   C:\OpenServer\domains\local.tourism.loc\bitrix\modules\main\classes\general\main.php:1072
#20: CAllMain->IncludeComponent
   C:\OpenServer\domains\local.tourism.loc\fotoreportazhi\index.php:104

Блог-note: заметки разработчика

Ускорение работы сайта на 1С-Битрикс

Данная статья написана специально под видеоролик (приложен в конце статьи), опубликованный на моем ВКVideo канал...

AJAX корзина с отправкой количества из раздела каталога

Столкнулся с задачкой: нужно было на одном сайте реализовать интерактивный прайс лист. При этом, у пользователя должна б...

Показать выбранные параметры умного фильтра над товарами, с возможностью отмены выбора

Задача: При выборе параметров товаров в умном фильтре показать выбранные параметры из чекбоксов в виде кнопок и предоста...

Смена вида карточек товаров в catalog.section с иммитацией AJAX

Смену вида карточек товаров, в разделе каталога, можно реализовать с помощью сессии, записывая в нее нужный вида шаблона...

Наличие на складах в умном фильтре 1С-Битрикс, с автоматическим обновлением

Задача: добавить возможность фильтрации товаров по складам в умном фильтре. Данные должны обновляться автоматически, при...

Ссылки для добавления и удаления товара из сравнения в Битрикс

Просто оставляю это здесь, вставка ссылок на добавление и удаление товара из сравнения, если уже добавлен. Чуть позже до...

Увидеть файл заказов который передаст Битрикс в 1С

Для диагностики обмена заказов, интернет-магазина на 1С Битрикс с 1С Управление Торговлей, нужно увидеть xml файл с зака...

Заполнение множественного пользовательского свойства типа "строка" через API

Задача: когда пользователь заходит в мобильное приложение, нужно сохранить FCM токен устройства в пользовательское поле ...

Показать пользователей онлайн на странице сайта

Задача: показать на странице сайта пользователей которые сейчас находятся на сайте. Используется штатный модуль "Ве...