Свой шаблон постраничной навигации
Чтобы кастомизировать постраничную навигацию, надо скопировать один из шаблонов системного компонента system.pagenavigation. Все содержимое папки modern копируем в папку pager:
Берем содержимое из bitrix/components/bitrix/system.pagenavigation/templates/modern и копируем в директорию local/templates/шаблон/components/bitrix/system.pagenavigation/pager.
Удаляем файл стилей style.css и создаем файл .description.php со следующим содержимом:
<?
/*
* Файл local/templates/шаблон/components/bitrix/system.pagenavigation/pager/.description.php
*/
if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();
$arTemplateDescription = array(
"NAME" => GetMessage("SYS_PAGER_TMPL_NAME"),
"DESCRIPTION" => GetMessage("SYS_PAGER_TMPL_DESCR"),
);
Добавляем или изменяем ланговый файл:
<?
/*
* Файл local/templates/шаблон/components/bitrix/system.pagenavigation/pager/lang/ru/description.php
*/
$MESS['SYS_PAGER_TMPL_NAME'] = 'Постраничная навигация';
$MESS['SYS_PAGER_TMPL_DESCR'] = 'Шаблон постраничной навигации';
Теперь нам надо отредактировать файл template.php. Распечатаем массив $arResult:
Array
(
[NavShowAlways] =>
[NavTitle] => Статьи
[NavRecordCount] => 11
[NavPageCount] => 6
[NavPageNomer] => 3
[NavPageSize] => 2
[bShowAll] =>
[NavShowAll] =>
[NavNum] => 1
[bDescPageNumbering] =>
[add_anchor] =>
[nPageWindow] => 5
[bSavePage] =>
[sUrlPath] => /blog/
[NavQueryString] =>
[sUrlPathParams] => /blog/?
[nStartPage] => 1
[nEndPage] => 5
[NavFirstRecordShow] => 5
[NavLastRecordShow] => 6
)
В нашем случае показывается список из 11 статей, по две статьи на страницу. Всего получается 6 страниц, но на последней странице только одна статья.
NavShowAlwaysвсегда показывать постраничную навигациюNavTitleназвание списка элементов, например «Статьи» или «Новости»NavRecordCountобщее количество статей (записей)NavPageCountобщее количество страницNavPageNomerномер текущей страницыNavPageSizeколичество статей на одну страницуbShowAllразрешено или нет показывать ссылку «Все статьи»NavShowAllравенtrue, если показываются все статьи, без постраничной навигацииNavNumномер постраничной навигации (PAGEN_1,PAGEN_2, …)bDescPageNumberingиспользовать или нет обратную постраничную навигациюnPageWindowколичество страниц, которые отображаются в постраничной навигацииbSavePageравнаtrueесли в главном модуле отмечена опция «Запоминать последнюю открытую страницу»sUrlPathпуть к странице относительно корняNavQueryStringстрока GET-параметровnStartPageномер первой страницы слева для текущей страницыnEndPageномер первой страница справа для текущей страницыNavFirstRecordShowпорядковый номер первой статьи на текущей страницеNavLastRecordShowпорядковый номер последней статьи на текущей странице
По поводу переменной bSavePage: Пример запрещает сохранение в сессии номера последней страницы при стандартной постраничной навигации. По умолчанию в сессии запоминается последняя открытая страница постраничной навигации:
CPageOption::SetOptionString("main", "nav_page_in_session", "N");
По поводу переменных nStartPage и nEndPage. Если текущая страница — третья (NavPageNomer=3), а показывается пять ссылок (nPageWindow=5), тогда nStartPage=1, а nEndPage=5:
<a href="...">1</a> <a href="...">2</a> <span>3</span> <a href="...">4</a> <a href="...">5</a>
Если текущая страница — четвертая (NavPageNomer=4), а показывается пять ссылок (nPageWindow=5), тогда nStartPage=2, а nEndPage=6:
<a href="...">2</a> <a href="...">3</a> <span>4</span> <a href="...">5</a> <a href="...">6</a>
По поводу переменных NavFirstRecordShow и NavLastRecordShow. У нас всего 11 статей на 6 страницах, по две статьи на страницу. Если текщая страница — третья, то NavFirstRecordShow=5, а NavLastRecordShow=6. На первой странице будут первая и вторая статьи, на второй странице — третья и четвертая, на третьей странице (текущей) — пятая и шестая.
Настраиваем шаблон:
<?php
/*
* local/templates/шаблон/components/bitrix/system.pagenavigation/pager/template.php
*/
if (!defined('B_PROLOG_INCLUDED') || B_PROLOG_INCLUDED!==true) die();
$this->setFrameMode(true);
// ссылка на первую страницу
$firstPageUrl = $arResult['sUrlPath'];
if (!empty($arResult['NavQueryString'])) {
$firstPageUrl = $firstPageUrl.'?'.$arResult['NavQueryString'];
}
// ссылка на последнюю страницу
$lastPageUrl = $arResult['sUrlPath'];
if (!empty($arResult['NavQueryString'])) {
$lastPageUrl = $lastPageUrl.'?'.$arResult['NavQueryString'].'&PAGEN_'.$arResult['NavNum'].'='.$arResult['NavPageCount'];
} else {
$lastPageUrl = $lastPageUrl.'?PAGEN_'.$arResult['NavNum'].'='.$arResult['NavPageCount'];
}
?>
<ul class="pager">
<?php if ($arResult['NavPageNomer'] > 1): /* ссылка на первую страницу */ ?>
<li>
<a href="<?= $firstPageUrl ?>" title="Первая">«</a>
</li>
<?php endif; ?>
<?php for ($i = $arResult['nStartPage']; $i <= $arResult['nEndPage']; $i++): ?>
<?php
// ссылка на очередную страницу
$pageUrl = $arResult['sUrlPath'];
if (!empty($arResult['NavQueryString'])) {
$pageUrl = $pageUrl.'?'.$arResult['NavQueryString'].'&PAGEN_'.$arResult['NavNum'].'='.$i;
} else {
$pageUrl = $pageUrl.'?PAGEN_'.$arResult['NavNum'].'='.$i;
}
?>
<?php if ($arResult['NavPageNomer'] == $i): /* если это текущая страница */ ?>
<li><span><?= $i; ?></span></li>
<?php else: ?>
<li><a href="<?= $pageUrl; ?>"><?= $i; ?></a></li>
<?php endif; ?>
<?php endfor; ?>
<?php if ($arResult['NavPageNomer'] < $arResult['NavPageCount']): /* ссылка на последнюю страницу */ ?>
<li>
<a href="<?= $lastPageUrl; ?>" title="Последняя">»</a>
</li>
<?php endif; ?>
</ul>
Настраиваем стили:
/*
* local/templates/шаблон/components/bitrix/system.pagenavigation/pager/style.css
*/
.pager {
overflow: hidden;
margin: 10px 0;
}
.pager li {
list-style: none;
float: left;
margin-right: 15px;
}
.pager li:last-child {
margin-right: 0;
}
.pager li a {
display: block;
width: 26px;
height: 26px;
text-align: center;
background: #395985;
font-size: 14px;
line-height: 26px;
color: #fff;
text-decoration: none;
}
.pager li span {
display: block;
width: 26px;
height: 26px;
text-align: center;
background: #e9751f;
font-size: 14px;
line-height: 26px;
color: #fff;
}