Подгрузка страниц на AJAX для элементов каталога в Битрикс

Подгрузка страниц на AJAX для элементов каталога в Битрикс

Для того, чтобы в Битрикс сделать бесконечную AJAX подгрузку страниц каталога, необходимо играться с параметром PAGEN_1 при включенной пагинации.

Выглядеть это будет примерно так:

Для начала определим в init.php переменную, в которой будем хранить количество элементов, отображаемых на странице при каждой прогрузке:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
/*
* количество элементов каталога на странице
*/
$elem_per_page = 48;
/* * количество элементов каталога на странице */ $elem_per_page = 48;
/*
 * количество элементов каталога на странице
 */
$elem_per_page = 48;

Далее пишем JS код, который будет вызываться при прокрутке страницы. Если мы достигаем подвала сайта — делаем AJAX запрос и добавляем в блок со списком товаров новые:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
/*AJAX прогрузка*/
$(document).ready(function(){
/* С какой страницы надо делать выборку из базы при ajax-запросе */
var startFrom = 2;
/* максимальное количество страниц */
<?php
CModule::IncludeModule("iblock");
//ID инфоблока каталога:
$catalog_iblock_id = 2;
//раздел каталога:
$catalog_section_id = 3;
$max_elements = CIBlockElement::GetList( array(),
array('IBLOCK_ID'=>$catalog_iblock_id,
'ACTIVE'=>'Y',
'SECTION_ID'=>$catalog_section_id,
'INCLUDE_SUBSECTIONS'=>'Y'
),
array(),
false,
array('ID',
'NAME')
);
$max_pages = ceil($max_elements/$elem_per_page);
?>
var maxPages = <?=$max_pages?>;
/* Переменная-флаг для отслеживания того, происходит ли в данный момент ajax-запрос. В самом начале даем ей значение false, т.е. запрос не в процессе выполнения */
var inProgress = false;
/*если количество элементов на странице < количества элементов в разделе*/
if (maxPages<startFrom) inProgress = true;
$(window).scroll(function() {
/* Если высота окна + высота прокрутки больше или равна высоте всего документа и ajax-запрос в настоящий момент не выполняется, то запускаем ajax-запрос. 600 - это высота подвала в пикселях */
if($(window).scrollTop() + $(window).height() >= $(document).height() - 600 && !inProgress) {
$.ajax({
url: '/ajax/catalog_pager.php',
method: 'POST',
data: {
"PAGEN_1" : startFrom,
"section_id": <?=$catalog_section_id?>
},
beforeSend: function() {
inProgress = true;
$(".iloader").append('<div id="preloader"></div>');
}
}).done(function(data){
$('#preloader').remove();
$(".iloader").append(data);
startFrom += 1;
if (maxPages>=startFrom){
inProgress = false;
}
});
}
});
});
/*AJAX прогрузка*/ $(document).ready(function(){ /* С какой страницы надо делать выборку из базы при ajax-запросе */ var startFrom = 2; /* максимальное количество страниц */ <?php CModule::IncludeModule("iblock"); //ID инфоблока каталога: $catalog_iblock_id = 2; //раздел каталога: $catalog_section_id = 3; $max_elements = CIBlockElement::GetList( array(), array('IBLOCK_ID'=>$catalog_iblock_id, 'ACTIVE'=>'Y', 'SECTION_ID'=>$catalog_section_id, 'INCLUDE_SUBSECTIONS'=>'Y' ), array(), false, array('ID', 'NAME') ); $max_pages = ceil($max_elements/$elem_per_page); ?> var maxPages = <?=$max_pages?>; /* Переменная-флаг для отслеживания того, происходит ли в данный момент ajax-запрос. В самом начале даем ей значение false, т.е. запрос не в процессе выполнения */ var inProgress = false; /*если количество элементов на странице < количества элементов в разделе*/ if (maxPages<startFrom) inProgress = true; $(window).scroll(function() { /* Если высота окна + высота прокрутки больше или равна высоте всего документа и ajax-запрос в настоящий момент не выполняется, то запускаем ajax-запрос. 600 - это высота подвала в пикселях */ if($(window).scrollTop() + $(window).height() >= $(document).height() - 600 && !inProgress) { $.ajax({ url: '/ajax/catalog_pager.php', method: 'POST', data: { "PAGEN_1" : startFrom, "section_id": <?=$catalog_section_id?> }, beforeSend: function() { inProgress = true; $(".iloader").append('<div id="preloader"></div>'); } }).done(function(data){ $('#preloader').remove(); $(".iloader").append(data); startFrom += 1; if (maxPages>=startFrom){ inProgress = false; } }); } }); });
  /*AJAX прогрузка*/
  $(document).ready(function(){
    /* С какой страницы надо делать выборку из базы при ajax-запросе */
    var startFrom = 2;
    
    /* максимальное количество страниц */
    <?php
    CModule::IncludeModule("iblock");
    //ID инфоблока каталога:
    $catalog_iblock_id = 2;
    //раздел каталога:
    $catalog_section_id = 3;
    $max_elements = CIBlockElement::GetList( array(),
                     array('IBLOCK_ID'=>$catalog_iblock_id,
                     'ACTIVE'=>'Y',
                     'SECTION_ID'=>$catalog_section_id,
                     'INCLUDE_SUBSECTIONS'=>'Y'
                     ),
                     array(),
                     false,
               array('ID',
                     'NAME')
                    );
    $max_pages = ceil($max_elements/$elem_per_page);
    ?>
        
    var maxPages = <?=$max_pages?>;   
    
    /* Переменная-флаг для отслеживания того, происходит ли в данный момент ajax-запрос. В самом начале даем ей значение false, т.е. запрос не в процессе выполнения */
    var inProgress = false;
    
    /*если количество элементов на странице < количества элементов в разделе*/
    if (maxPages<startFrom) inProgress = true;
    $(window).scroll(function() {
      /* Если высота окна + высота прокрутки больше или равна высоте всего документа и ajax-запрос в настоящий момент не выполняется, то запускаем ajax-запрос. 600 - это высота подвала в пикселях */
      if($(window).scrollTop() + $(window).height() >= $(document).height() - 600 && !inProgress) {
          
        $.ajax({
          url: '/ajax/catalog_pager.php',
          method: 'POST',
          data: {
              "PAGEN_1" : startFrom,
              "section_id": <?=$catalog_section_id?>
              },
          beforeSend: function() {
            inProgress = true;
            $(".iloader").append('<div id="preloader"></div>');
          }
          }).done(function(data){
          
            $('#preloader').remove();
            
            $(".iloader").append(data);
            startFrom += 1;
            if (maxPages>=startFrom){
              inProgress = false;
            }  
            
          });
          
      }
    });
  });

В плане вёрстки делаем так: элементы каталога отображаем в div-е с классом «iloader».

JS код, представленный выше добавляем в ваш шаблон catalog.section на странице раздела каталога.

В /ajax/catalog_pager.php также отображаем catalog.section но уже с другой вёрсткой (там будут отображаться элементы каталога, которые подгружаются по каждому ajax запросу). Примерно так:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
$params = Array(
...
'SECTION_ID' => $_REQUEST['section_id'],
...
);
$APPLICATION->IncludeComponent(
'bitrix:catalog.section',
'<ваш_шаблон>',
$params
);
?>
<?php $params = Array( ... 'SECTION_ID' => $_REQUEST['section_id'], ... ); $APPLICATION->IncludeComponent( 'bitrix:catalog.section', '<ваш_шаблон>', $params ); ?>
<?php
$params = Array(
                ...
                'SECTION_ID' => $_REQUEST['section_id'],
                ...
            );
$APPLICATION->IncludeComponent(
        'bitrix:catalog.section',
        '<ваш_шаблон>',
        $params
        );      
?>

Собственно вся магия 🙂