Есть код пагинации, код хороший, но есть нюанс, пагинация начинается со второй страницы, т.е. 1 [2] 3 4 5
, это из-за того, что старт отсчёта идёт с 0, а я передаю 1, как ни как первая страница. Всяко пробовал, то с 0 отсчёт идёт, то другой баг
вот код
<?php
class SimPageNav
{
protected $id;
protected $startChar;
protected $prevChar;
protected $nextChar;
protected $endChar;
/**
* Конструктор
* @param string $id - атрибут ID элемента <UL> - постраничной навигации
* @param string $startChar - текст ссылки "В начало"
* @param string $prevChar - текст ссылки "Назад"
* @param string $nextChar - текст ссылки "Вперед"
* @param string $endChar - текст ссылки "В конец"
*/
public function __construct( /*string*/ $id = 'pagination pagination-sm',
/*string*/ $startChar = '«',
/*string*/ $prevChar = '‹',
/*string*/ $nextChar = '›',
/*string*/ $endChar = '»' )
{
$this->id = $id;
$this->startChar = $startChar;
$this->prevChar = $prevChar;
$this->nextChar = $nextChar;
$this->endChar = $endChar;
}
/**
* Получить HTML - код постраничной навигации
* @param int $all - Полное кол-во элементов (Материалов в категории)
* @param int $limit - Кол-во элементов на странице
* @param int $start - Текущее смещение элементов
* @param int $linkLimit - Количество ссылок в состоянии
* @param string $varName - Имя GET - переменной которая будет использоваться в постр. навигации.
* @return string
*/
public function getLinks( /*int*/ $all, /*int*/ $limit, /*int*/ $start, $linkLimit = 10, $varName = 'page' )
{
// Нихрена не делаем, если лимит больше или равен кол-ву всех элементов вообще,
// И если лимит = 0. 0 - будет означать "не разбивать н астраницы".
if ( $limit >= $all || $limit == 0 ) {
return NULL;
}
$pages = 0; // кол-во страниц в пагинации
$needChunk = 0; // индекс нужного в данный момент чанка
$queryVars = array(); // ассоц. массив полученный из строки запроса
$pagesArr = array(); // пременная для промежуточного хранения массива навигации
$htmlOut = ''; // HTML - код постраничной навигации
$link = NULL; // формируемая ссылка
// В этом блоке мы просто строим ссылку - такую же, как та, по которой
// пришли на данную страницу, но извлекаем из неё нашу GET-переменную:
$purl = parse_url('http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']);
$pqu = $purl['query'];
parse_str($pqu, $queryVars); // &$queryVars
// Убиваем нашу GET-переменную
if( isset($queryVars[$varName]) ) {
unset( $queryVars[$varName] );
}
// Формируем такую же ссылку, ведущую на эту же страницу:
$qe = http_build_query($queryVars);
$link = $purl['path'].'?'.$qee;
//--------------------------------------------------------
$pages = ceil( $all / $limit ); // кол-во страниц
// Заполняем массив: ключ - это номер страницы, значение - это смещение для БД.
// Нумерация здесь нужна с единицы. А смещение с шагом = кол-ву материалов на странице.
for( $i = 0; $i < $pages; $i++) {
$pagesArr[$i+1] = $i * $limit;
}
// Теперь что бы на странице отображать нужное кол-во ссылок
// дробим массив со значениями [№ страницы] => "смещение" на
// Части (чанки)
$allPages = array_chunk($pagesArr, $linkLimit, true);
// Получаем индекс чанка в котором находится нужное смещение.
// И далее только из него сформируем список ссылок:
$needChunk = $this->searchPage( $allPages, $start );
// Формируем ссылки "В начало", "передыдущая" ------------------------------------------------
if ( $start > 1 ) {
$htmlOut .= '<li><a href="'.$link.$varName.'=0">'.$this->startChar.'</a></li>'.
'<li><a href="'.$link.$varName.'='.($start - $limit).'">'.$this->prevChar.'</a></li>';
} else {
$htmlOut .= '<li class="disabled"><a href="#">'.$this->startChar.'</a></li>'.
'<li class="disabled"><a href="#">'.$this->prevChar.'</a></li>';
}
// Собсно выводим ссылки из нужного чанка
foreach( $allPages[$needChunk] AS $pageNum => $ofset ) {
// Делаем текущую страницу не активной:
if( $ofset == $start ) {
$htmlOut .= '<li class="active"><a href="#">'. $pageNum .'</a></li>';
continue;
}
$htmlOut .= '<li><a href="'.$link.$varName.'='. $ofset .'">'. $pageNum . '</a></li>';
}
// Формируем ссылки "следующая", "в конец" ------------------------------------------------
if ( ($all - $limit) > $start) {
$htmlOut .= '<li><a href="' . $link.$varName . '=' . ( $start + $limit) . '">' . $this->nextChar . '</a></li>'.
'<li><a href="' . $link.$varName . '=' . array_pop( array_pop($allPages) ) . '">' . $this->endChar . '</a></li>';
} else {
$htmlOut .= '<li class="disabled"><a href="#">' . $this->nextChar . '</a></li>'.
'<li class="disabled"><a href="#">' . $this->endChar . '</a></li>';
}
return '<div class="text-center mrgp"><ul class="'.$this->id.'">' . $htmlOut . '<ul></div>';
}
/**
* Ищет в каком чанке находится сраница со смещением $needPage
* @param array $pagesList массив чанков (массивов страниц разбитый по лимиту ссылок на странице)
* @param int $needPage - смещение
* @return number Ключ чанка в котором есть нужная страница
*/
protected function searchPage( array $pagesList, /*int*/$needPage )
{
foreach( $pagesList AS $chunk => $pages ){
if( in_array($needPage, $pages) ){
return $chunk;
}
}
return 0;
}
}
Подключаю так:
$pageNav = new SimPageNav();
$pages = ceil($co/$num);
echo $pageNav->getLinks($pages, 1, $page, 10, 'page');
Строка 80 заменить на $pagesArr[$i+1] = $i * $limit+1;
Строка 95 заменить на $htmlOut .= '<li><a href="'.$link.$varName.'=1">'.$this->startChar.'</a></li>'.
А вести отсчёт с 0, но при выводе показывать число на единицу больше - не?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
я интегрирую оплату с paypal express checkout по примеру https://devtools-paypalcom/integrationwizard/
Есть такой код функции форматирования url, полученный из поля ввода