Форумы / National / Russian / Тех. поддержка / Пагинация на AJAX не работает

prostogorod
#1 12.02.2026 15:22

Дано: Cotonti 0.9.25 и Плагин фильтр на AJAX - работает, фильтрует по параметрам. Но в нем не работает пагинация на AJAX. Что сделал не так? 

Этот плагин работает на  листинге в модуле Page. И еще вопрос, пагинация на модуле не пропадает, когда появляется результат плагина- фильтра со своей пагинацией. Почему так?

    $autonav = cot_pagenav(
        'plug',                                              // 1. Модуль
        ['e' => 'filter', 'dc' => $dcurl] + $list_url_path,  // 2. Параметры URL
        $d,                                                  // 3. Текущее смещение
        $totallines,                                         // 4. Всего записей
        $maxAutoRowsPerAuto,                                 // 5. Записей на страницу
        'd',                                                 // 6. Имя переменной пагинации
        '',                                                  // 7. Якорь (hash)
        true,                                                // 8. Включить AJAX (ajax = true)
        'auto-filter-content',                               // 9. ID блока для обновления (target_div)
    );
    
    $t->assign(cot_generatePaginationTags($autonav));
Отредактировано: prostogorod (12.02.2026 15:30, 1 месяц назад)
Kort
#2 13.02.2026 06:55

Привет. Паджинацию не надо дублировать. Вообще, без аякса работает?

SED.by - создание сайтов, разработка плагинов и тем для Котонти
prostogorod
#3 13.02.2026 14:13

#48615 Kort: 
 

Вообще, без аякса работает?

Привет! Да, вы правы... Она и без акяса не работает. Вроде все делал по аналогии с модулем Page. Ладно, попробую сначала настроить пагинацию с  акяс на модуле Page. 

 

#48615 Kort: 
 

Паджинацию не надо дублировать.

А это как понять?. 

....

Вобщем, не получается настроить даже аякс на Page, делал так:

1. В ресурсах добавил класс для пагинации - ajax

2. Настройка cot_pagenav на листинге:
$pagenav_cat = cot_pagenav(
    'page',
    $list_url_path + ['d' => $durl],
    $dc,
    count($allsub),
    Cot::$cfg['page']['maxlistsperpage'],
    'dc',                                               
    '',                                                
    true,                                             
    'auto-filter-content',   
);

3. При нажатии на пагинацию - ничего не проиходит.
 url в браузере - acura#get;d=2  
 url в пагинации - <a class="page-link ajax" href="acura?d=2">2</a>
 
4.   В шаблоне пагинация находитсяв блоке id="auto-filter-content"
    <div class="row" id="auto-filter-content">      
        <!-- IF {PAGINATION}-->
             <div class="col-12  pt-3 pb-3">....</div>					   
        <!-- ENDIF -->	
	</div>	

 

 

Отредактировано: prostogorod (13.02.2026 14:58, 1 месяц назад)
Kort
#4 13.02.2026 16:21

Я просто не понял про это:

пагинация на модуле не пропадает, когда появляется результат плагина- фильтра со своей пагинацией

Паджинатор всегда один, а аякс ты подключаешь настройкой. И в id-wrapper нужно брать не только паджинатор, а весь блок.

И если что-то не работает, смотри ответ в консоли. Обязательно включи отображение ошибок в datas/config.php

Но вообще, сперва надо продебажить эту историю и заставить работать твой паджинатор без аякса.

У меня в админке в модальном окне выводятся список пользователей и whosonline. Естественно, паджинатор с аяксом. Там все предельно просто:

<?php
/* ====================
[BEGIN_COT_EXT]
Hooks=whosonline.main
[END_COT_EXT]
==================== */

defined('COT_CODE') or die('Wrong URL');

if (ajax_true()) {
  // Это необязательно)))
  require_once cot_incfile('icons', 'plug', 'resources');
  require_once cot_incfile($theme, 'theme', 'rc.pagination');
  // А здесь не ошибешься
  $pagenav = cot_pagenav('whosonline', ['d' => $durl], $d, $totallines, $maxuserssperpage, 'd', '', true, 'ajaxmodalcont');
}

Так что проблема скорее всего в самом фильтре (99% на sql-запрос). В консоли все увидишь.

SED.by - создание сайтов, разработка плагинов и тем для Котонти
prostogorod
#5 13.02.2026 19:33

Пока фильтр отключил. Решил только разобраться с аякс пагинацией на Page. Обычная пагинация работает, а вот аякс пагинацией на Page не работает.
Я посмотрел в консоль fetch/xhr response. Статус 200. Отдает весь весь html, что в шаблоне, с остатком результата листинга. 
Так почему не обновляется страница? А также почему весь html всего шаблона, а не кусок id-wrapper отдает?

Отредактировано: prostogorod (13.02.2026 20:40, 1 месяц назад)
Kort
#6 13.02.2026 20:41

Чтобы в ID-wrapper отдавалась не вся страница, а только сами данные, лишнее надо отсечь. Примерно так:

<!-- BEGIN: MAIN -->
<!-- IF !{PHP|ajax_true()} -->
<main id="users" class="mb-4">
	<div class="container">
		<div class="row mt-5">
			<div class="col">
				<div class="title mb-3 px-2 px-sm-0">
					<h1 class="lh-1 mb-1">{PHP.L.Users}</h1>
					<ul class="breadcrumb mb-0">
						<li class="breadcrumb-item"><a href="{PHP.cfg.mainurl}" title="{PHP.L.Home}">{PHP.L.Home}</a></li>
						<li class="breadcrumb-item">{PHP.L.Users}</li>
					</ul>
				</div>
				<!-- ENDIF -->
				<!-- ЗДЕСЬ ФИЛЬТР И ПАДЖИНАТОР -->
				<!-- IF !{PHP|ajax_true()} -->
			</div>
		</div>
	</div>
</main>
<!-- ENDIF -->

Функция простая:

if (!function_exists('ajax_true')) {
	function ajax_true() {
		if (COT_AJAX) {
			$res = true;
		} else {
			$res = false;
		}
		return $res;
	}
}

Еще раз: в ID-wrapper включай не только паджинатор, но и вывод.

SED.by - создание сайтов, разработка плагинов и тем для Котонти

Поблагодарили: prostogorod (13.02.2026)
prostogorod
#7 13.02.2026 23:34

Благадарю за помощь! Уже что-то понятней стало в понимании. Заработала пагинациея аякс на Page.
А почему при аякс пропадают классы в пагинации? А при клике на последнию страницу, просходит переход, но сильно скролит вниз. Как с этим бороться?

Kort
#8 14.02.2026 07:21

По классам знакомая история. При аякс-запросе если что-то и грузится, то только дефолтное. Я ужа давно выношу кастомную разметку паджинации в отдельный файл theme_name.rc.pagination.php:

<?php

include_once cot_incfile('icons', 'plug', 'resources');

$R['link_pagenav_current']  = '<li class="page-item active"><a href="{$url}" class="page-link {$class}" {$rel}>{$num}</a></li>';

$R['link_pagenav_first']    = '<li class="page-item first"><a href="{$url}" class="page-link {$class}" {$rel}>' . Cot::$R['icon-arrow-left'] . '</a></li>';
$R['link_pagenav_prev']     = '<li class="page-item"><a href="{$url}" class="page-link {$class}" {$rel}>' . Cot::$R['icon-chevron-left'] . '</a></li>';
$R['link_pagenav_main']     = '<li class="page-item"><a href="{$url}" class="page-link {$class}" {$rel}>{$num}</a></li>';
$R['link_pagenav_next']     = '<li class="page-item"><a href="{$url}" class="page-link {$class}" {$rel}>' . Cot::$R['icon-chevron-right'] . '</a></li>';
$R['link_pagenav_last']     = '<li class="page-item last"><a href="{$url}" class="page-link {$class}" {$rel}>' . Cot::$R['icon-arrow-right'] . '</a></li>';

$R['link_pagenav_gap']      = '<li class="page-item disabled"><span class="page-link">...</span></li>';

И гружу его из theme_name.php или из аякс-частей:

require_once cot_incfile($theme, 'theme', 'rc.pagination');

Это из сниппета выше ^^^. Ну и, при необходимости, библиотеку иконок.

По кнопке "Последняя": она у меня при аяксовании работает как "Следующая страница". Тикет.

По поводу скролла не знаю, надо посмотреть. Но, думаю, решаемо)

SED.by - создание сайтов, разработка плагинов и тем для Котонти
Отредактировано: Kort (14.02.2026 07:29, 1 месяц назад)

Поблагодарили: prostogorod (17.02.2026)
prostogorod
#9 17.02.2026 11:32

Спасибо, многие вопросы решил, остался главный- формирования url пагинации фильтра. Этот скрипт возвращает фокус внимания пользователя с блока пагинации на обновленный контент. Страница перезагружается и браузер сам плавно "прыгает" наверх, может кому-то пригодится.

$(document).on('ajaxSuccess', function() {
    var container = $('#news-container');
    if (container.length > 0) {
        $('html, body').animate({
            scrollTop: container.offset().top - 20 // 20px запас сверху
        }, 400);
    }
});

 

Пишу плагин фильтрации и запутался в архитектуре ссылок.

Логика сейчас:

1.Данные фильтра летят через AJAX.

2.Обработчик filter.ajax.php отдает готовый HTML (результаты + пагинация).

3.JS вставляет это в контейнер: $("#auto-filter-content").html(response.html); в page.list.tpl.

Вопросы:

1. URL пагинации: Как правильно формировать ссылки в пагинации внутри AJAX-ответа? Должны ли они вести на основной листинг (например, /category?d=2) или на обработчик фильтра? Как в таком случае сохранять состояние фильтров при переходе по страницам?

2. Контейнеры: Обязательно ли id блока пагинации должен совпадать с id основного контента, если я обновляю всё разом?

3. Маршрутизация: Стоит ли перенести логику из отдельного файла на хук standalone (URL типа /filter), чтобы корректно работало ЧПУ и системные переменные Cotonti? Если, да, то желательно с примером. У меня здесь ступор, я не знаю как сделать? Верне не знаю, как на этом хуке обработчик на аякс работал?

Отредактировано: prostogorod (17.02.2026 11:55, 1 месяц назад)
Kort
#10 18.02.2026 09:05

Если я правильно понимаю,то:

  1. В твоем плагине должна быть аяксовая часть (Hooks=ajax), которая будет импортировать все передаваемые запросом параметры. Если фильтр мудреный, возможно и с urldecode(). Таким образом на каждой странице будет все как надо.
  2. id на странице всегда один -- непонятно что имелось ввиду.
  3. Здесь непонятно. По идее, твой плагин должен к параметру d добавлять свои параметры фильтрации. Иногда для таких параметров требуется urlencode(). Прежде всего, это должно работать без аякса. И тогда можно настроить ЧПУ. Для аяксовых дел придется сильно подумать.
    Но я, опять же сильно, сомневаюсь что при аяксовой паджинации можно (и нужно) мутить ЧПУ и прочие дела. Поисковики в лучшем случае проигнорируют, а в худшем будешь выставлять rel="nofollow" и мета robots noindex и выковыривать из индекса ссылки твоего фильтра. Впрочем, meta robots понадобится для результатов фильтра в любом случае))
SED.by - создание сайтов, разработка плагинов и тем для Котонти