Скрипт постраничной навигации (расширенная версия)
Не так давно я опубликовал пост в котором приводил пример скрипта постраничной навигации. Скрипт был предельно прост, выводил ссылки: [В начало, Предыдущая, 1, 2, 3, Следующая, В конец]. Примеров аналогично скрипта старой версии в интернете множество и у всех у них есть один весомый недостаток — навигация выводится в виде трех-пяти ссылок га ближайшие страницы, а что делать если у нас 1000 страниц?
Пример работы скрипта старой версии:
В результате я решил написать новую версию скрипта, в которой был бы предусмотрен вывод большого числа страниц, а так же информации о текущей странице и их общего числа, кроме всего хотелось бы так же иметь возможность задавать вручную номер желаемой страницы.
Пример работы скрипта новой версии:
Скрипт представляет собой PHP функцию.
Параметры функции pagenation();
2. $num — Количество выводимых записей на страницу
3. $di — Количество страниц отображаемых в навигации, умноженное на два.
4. $link_url — Адрес текущей страницу, будет пожставлен к ссылкам постраничной навигации (вначало)
5. $DBtable — Название таблицы в базе данных, вывод из которой производится
6. $DBwhere — Можно указать условие, по которому будут выводится записи из БД
7. $type — Тип выводимой постраничной навигации, 1 — простая навигация, 2 — навигация + статус (пример: Страница 1 из 15), 3 — навигация + статус + HTML форма, для ввода номера страницы и быстрого перехода на нее
8. $settings — Массив с параметрами подключения к БД
$settings[‘db_host’] = ‘localhost’;
$settings[‘db_name’] = ‘dbname’;
$settings[‘db_user’] = ‘user’;
$settings[‘db_pass’] = ‘pass’;
Пример вызова функции
$pgn = pagenation(@$_REQUEST['page'], 10, 10, '?idpost=1', 'regions', "", 3, $settings); |
В этом случае функция вернет следующие значения:
Данная функция возвращает ассоциативный массив, в котором садержаться следующие значение
$pgn[‘num’] — количество выводимых записей
$pgn[‘tatal’] — количество страниц
$pgn[‘posts’] — общее количество записей в таблице
$pgn[‘html’] — готовый HTML код постраничной разбивки
$pgn[‘status’] — (если указан $type = 2)содержит информацию(HTML код) о текущей странице и общем количестве страниц (пример: Страница 1 из 15 )
$pgn[‘from’] — (если указан $type = 3) содержит HTML форму, для ввода номера страницы и быстрого перехода на нее
Системные требования скрипта
В скрипте используется библиотека PHP PDO, для работы с базой данный mySQL (библиотека php-pdo_mysq), для его работы требуется версия PHP 5.2 и более. База данный mySQL версии 4 и более.
Привожу полный листинг всего скрипта, вместе с HTML и CSS кодом, думаю при желании вы без особого труда сможете изменить его и интегрировать в свой сайт. Листинг содержит подробные комментарии.
<?php error_reporting('E_WARNING'); //Настройки подключения к БД $settings['db_host'] = 'localhost'; $settings['db_name'] = 'dbname'; $settings['db_user'] = 'user'; $settings['db_pass'] = 'pass'; $settings['db_charset'] = 'utf8'; /* * pagenation($page = 1, $num = 10, $di = 10 (диапазон разброса), $link_url = '', $DBtable, $DBwhere, $settings (Параметры подключения к БД)) * type (1 - pagenation, 2 - +status, 3 - +form) * return = array ('start' => NUM, 'num' => NUM, 'total' => NUM, 'posts' => NUM, 'html' = TEXT, 'status' = TEXT, 'form' = TEXT) */ function pagenation($page = 1, $num = 10, $di = 10, $link_url = '', $DBtable, $DBwhere, $type = 1, $settings) { if($DBwhere>'')$DBwhere = 'WHERE '.$DBwhere; $db = new PDO("mysql:dbname={$settings['db_name']};host={$settings['db_host']}",$settings['db_user'],$settings['db_pass']); // подключаемся к БД $sql = "SELECT count(`id`) FROM `$DBtable` $DBwhere"; $posts = $db->query($sql)->fetchColumn(); // получем значение кол-во всех записей $total = intval(($posts - 1) / $num) + 1; $page = intval($page); if(empty($page) or $page < 0) $page = 1; if($page > $total) $page = $total; $start = $page * $num - $num; if ($page != 1) $pervpage = "<a href=\"$link_url&page=-1\"><<</a> <a href=\"$link_url&page=".($page-1)."\"><</a> "; if ($page != $total) $nextpage = "<a href=\"$link_url&page=".($page+1)."\">></a> <a href=\"$link_url&page=$total\">>></a> "; $out='<span>'.$page.'</span>'; for($i=1;$i<=$di;$i++): if($page - $i > 0) $pageL = "<a href=\"$link_url&page=".($page-$i)."\">".($page-$i)."</a> "; else $pageL=''; if($page + $i <= $total) $pageR = "<a href=\"$link_url&page=".($page+$i)."\">".($page+$i)."</a>"; else $pageR=''; $out=$pageL.$out.$pageR; endfor; $out='<div class="pagenation" align="center">'.$pervpage.$out.$nextpage.'</div>'; if($type>=2)$data['status']="<div class=\"pagenation-info\">Страница $page из $total</div>"; if($type==3)$data['form']="<form class=\"pagenation-form\" method=\"post\" action=\"$link_url\"><input type=\"text\" name=\"page\" value=\"$page\" class=\"inputbox\"/><input type=\"submit\" value=\">>\"/></form>"; $data['start']=$start; $data['num']=$num; $data['total']=$total; $data['posts']=$posts; $data['html']=$out; return $data; } /* Параметры функции pagenation(); 1. $page - Текущая страница, значение берется из $_REQUEST['page'] 2. $num - Количество выводимых записей на страницу 3. $di - Количество страниц отображаемых в навигации, умноженное на два. 4. $link_url - Адрес текущей страницу, будет пожставлен к ссылкам постраничной навигации (вначало) 5. $DBtable - Название таблицы в базе данных, вывод из которой производится 6. $DBwhere - Можно указать условие, по которому будут выводится записи из БД 7. $type - Тип выводимой постраничной навигации, 1 - простая навигация, 2 - навигация + статус (пример: Страница 1 из 15), 3 - навигация + статус + HTML форма, для ввода номера страницы и быстрого перехода на нее 8. $settings - Массив с параметрами подключения к БД $settings['db_host'] = 'localhost'; $settings['db_name'] = 'dbname'; $settings['db_user'] = 'user'; $settings['db_pass'] = 'pass'; */ $pgn = pagenation($_REQUEST['page'], 10, 10, '?idpost=1', 'table', "", 3, $settings); /* Данная функция возвращает ассоциативный массив, в котором садержаться следующие значение $pgn['start'] - начало выводимых записей из БД $pgn['num'] - количество выводимых записей $pgn['tatal'] - количество страниц $pgn['posts'] - общее количество записей в таблице $pgn['html'] - готовый HTML код постраничной разбивки $pgn['status'] - (если указан $type = 2)содержит информацию(HTML код) о текущей странице и общем количестве страниц (пример: Страница 1 из 15 ) $pgn['from'] - (если указан $type = 3) содержит HTML форму, для ввода номера страницы и быстрого перехода на нее */ //получаем записи из БД (начиная с $start, кол-во записей = $num) $db = new PDO("mysql:dbname={$settings['db_name']};host={$settings['db_host']}",$settings['db_user'],$settings['db_pass']); $db->query ( "SET character_set_connection = '{$settings['db_charset']}';"); $db->query ( "SET character_set_client = '{$settings['db_charset']}';"); $db->query ( "SET character_set_results = '{$settings['db_charset']}';"); $db->query ( "SET NAMES '{$settings['db_charset']}';"); $db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); // Коннектимся с базой и устанавливаем кодировку. $sql = "SELECT * FROM `table` LIMIT {$pgn['start']}, {$pgn['num']}"; $allposts = $db->query($sql)->fetchAll(); // получем список записей которые будем выводить на данной странице ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/> <style> #contener {margin:20px auto;width:500px;position:relative;} .pagenation {color: #636363;border: 0px;font-family: tahoma;margin:10px 0} .pagenation a:link,.pagenation a:visited,.pagenation a:active {display: inside;text-decoration: none;color: #FFF;background-color: #13739B;border: 1px solid #e1e1e3;padding: 3px 6px;font-size: 11px} .pagenation a:hover {background-color: #24323B;color: #ffffff;border-color: #e1e1e3;} .pagenation span {text-decoration: none;background-color: #24323B;padding: 3px 6px;border: 1px solid #e1e1e3;color: #fff;font-size: 11px;} .pagenation span.nav_ext {border: none;background: transparent;} .pagenation-form .inputbox {width:40px;border:1px solid #eee;} </style> </head> <body> <div id="contener"> <!-- Выводим список записей, ID записи и название--> <?foreach($allposts as $item):?> <?=$item['id']?>. <?=$item['name']?><br/> <?endforeach?> <?php // если страниц больше чем одна, выводим постраничную навигацию if ($pgn['total']>1) echo $pgn['html'].$pgn['status'].$pgn['form']; ?> </div> </body> </html> |
Надеюсь данный скрипт будет вам полезен. так же вы можете скачать его исходник и посмотреть живой пример работы (вывод списка регионов).
Похожие записи
13 комментариев to “Скрипт постраничной навигации (расширенная версия)”
Оставить комментарий
Full Stack
Senior, Architect
предложить оффер
- jQuery: как получить значение атрибута?
- PHP работа с изображением, класс SimpleImage
- Интеграция с API ОСАГО сайта sravni.ru
- Комментарии на PHP, Ajax, mySQL
- PHP: Категории бесконечного уровня вложенности.
- Nginx редирект на другой сервис с сохранением URL спросил (а) Сергей
- Исполнитель пропал, почему такое случается и понять с кем работать? спросил (а) Артем
- Можно ли WordPress считать универсальным движком? спросил (а) Андрей
- Что такое самописный скрипт или CMS? спросил (а) Антон
- Как при поиске в linux используя grep, добавить исключения? спросил (а) Алексей
- Консольный скрипт(JavaScript) для автоматических заказов на OZON к записи
- Консольный скрипт(JavaScript) для автоматических заказов на OZON к записи
- Как создать Telegram-бота с авторизацией через сайт к записи
- PHP скрипт: каталог закладок на сайты к записи
- Валидация на PHP к записи
- Сколько зарабатывают в бизнесе на совместных покупках к записи
- Сколько зарабатывают в бизнесе на совместных покупках к записи
Archive
- +2024 (25)
- Ноябрь 2024 (10)
- Октябрь 2024 (8)
- Сентябрь 2024 (1)
- Август 2024 (5)
- Май 2024 (1)
- +2023 (27)
- Ноябрь 2023 (1)
- Октябрь 2023 (13)
- Сентябрь 2023 (10)
- Апрель 2023 (1)
- Март 2023 (1)
- Февраль 2023 (1)
- +2022 (21)
- Декабрь 2022 (11)
- Ноябрь 2022 (1)
- Май 2022 (2)
- Апрель 2022 (2)
- Март 2022 (3)
- Февраль 2022 (1)
- Январь 2022 (1)
- +2021 (17)
- Декабрь 2021 (5)
- Ноябрь 2021 (2)
- Июль 2021 (1)
- Июнь 2021 (2)
- Май 2021 (5)
- Апрель 2021 (1)
- Март 2021 (1)
- +2020 (20)
- Декабрь 2020 (6)
- Сентябрь 2020 (2)
- Август 2020 (1)
- Июль 2020 (2)
- Май 2020 (2)
- Апрель 2020 (2)
- Март 2020 (2)
- Февраль 2020 (1)
- Январь 2020 (2)
- +2019 (18)
- Декабрь 2019 (3)
- Ноябрь 2019 (2)
- Октябрь 2019 (2)
- Сентябрь 2019 (1)
- Август 2019 (2)
- Июль 2019 (1)
- Июнь 2019 (1)
- Апрель 2019 (2)
- Март 2019 (1)
- Февраль 2019 (3)
- +2018 (44)
- Декабрь 2018 (4)
- Ноябрь 2018 (7)
- Октябрь 2018 (8)
- Сентябрь 2018 (1)
- Август 2018 (4)
- Июль 2018 (5)
- Май 2018 (3)
- Апрель 2018 (7)
- Март 2018 (1)
- Февраль 2018 (2)
- Январь 2018 (2)
- +2017 (19)
- Декабрь 2017 (2)
- Ноябрь 2017 (1)
- Октябрь 2017 (1)
- Сентябрь 2017 (2)
- Июль 2017 (1)
- Июнь 2017 (1)
- Май 2017 (2)
- Апрель 2017 (3)
- Март 2017 (2)
- Февраль 2017 (1)
- Январь 2017 (3)
- +2016 (36)
- Декабрь 2016 (3)
- Ноябрь 2016 (3)
- Октябрь 2016 (2)
- Сентябрь 2016 (3)
- Август 2016 (7)
- Июнь 2016 (3)
- Май 2016 (3)
- Апрель 2016 (3)
- Февраль 2016 (1)
- Январь 2016 (8)
- +2015 (36)
- Ноябрь 2015 (5)
- Октябрь 2015 (4)
- Сентябрь 2015 (1)
- Август 2015 (8)
- Июнь 2015 (1)
- Май 2015 (4)
- Апрель 2015 (8)
- Март 2015 (3)
- Февраль 2015 (2)
- +2014 (26)
- Ноябрь 2014 (2)
- Октябрь 2014 (5)
- Сентябрь 2014 (6)
- Июль 2014 (1)
- Июнь 2014 (2)
- Май 2014 (3)
- Апрель 2014 (6)
- Февраль 2014 (1)
- +2013 (27)
- Декабрь 2013 (2)
- Ноябрь 2013 (1)
- Октябрь 2013 (1)
- Август 2013 (1)
- Июль 2013 (3)
- Июнь 2013 (10)
- Май 2013 (1)
- Апрель 2013 (2)
- Февраль 2013 (3)
- Январь 2013 (3)
- +2012 (41)
- Декабрь 2012 (2)
- Ноябрь 2012 (3)
- Октябрь 2012 (7)
- Сентябрь 2012 (2)
- Август 2012 (1)
- Июль 2012 (3)
- Июнь 2012 (2)
- Май 2012 (6)
- Апрель 2012 (2)
- Март 2012 (7)
- Февраль 2012 (5)
- Январь 2012 (1)
- +2011 (57)
- Декабрь 2011 (6)
- Ноябрь 2011 (2)
- Октябрь 2011 (3)
- Сентябрь 2011 (5)
- Август 2011 (4)
- Июль 2011 (3)
- Июнь 2011 (3)
- Май 2011 (3)
- Апрель 2011 (4)
- Март 2011 (10)
- Февраль 2011 (5)
- Январь 2011 (9)
- +2010 (43)
- Декабрь 2010 (7)
- Ноябрь 2010 (21)
- Октябрь 2010 (14)
- Сентябрь 2010 (1)
Свежие записи
- Интеграция платежной системы MoonPay на сайт по API 10.11.2024
- Парсер товаров с Taobao 08.11.2024
- Упаковка и минификация кода JavaScript онлайн 07.11.2024
- Как эффективно анализировать логи при DDOS атаке 07.11.2024
- Бот для автоматических заказов на OZON (плагин для Chrome) 07.11.2024
спасибо)))ваш блог просто находка для моего сайта,все что нужно для меня прям))кстати обзор скрипа комментирования начал писать)вы молодец,таких людей очень мало к сожалению((
не могу разобраться( и пример не работает
я в вашем исходнике меняю параметры подключения к базе, ставлю в вызове функции свою таблицу — но без результатно — не работает, что я делаю не так? или что я упускаю? в общем как запустить?)
Возможно, что-то делаете не так. скинте мне ваш код в обратную связь, я попробую разобраться где допущена ошибка.
а вот, уже разобрался!) Ошибка в моих руках, — не от туда… Спасибо за код (он у вас качественный) и оперативность! И вообще за Ваш замечательный сайт!
!!!! Это конечно всё хорошо, НО 150 строчек кода обработка на сервере а чего добились?
по сути идеальный вариант — всегда видим номера первой и последней страницы какие то промежуточные и !!! внимание фишка — на javascript либо css реализовывается вывод всего количества страниц в дополнительную область либо всплывающей подсказкой . В рамках 200 страниц это боле чем лучшее решение. а пхп в штатном режиме уже всё обработает.
Да вполне с вами согласен, данный пример всего скорее носит ознакомительный характер или вариант для небольшого кол-ва страниц. В будущем возможно будет реализован более продвинутый скрипт со всеми вами описанными возможностями.
Сделал с вашей пагинацией то что не мог сделать с другими. А именно, соединение нескольких таблиц из базы, чтобы не создавать для каждой категории(таблицы) отдельных файлов. Теперь, записи выводятся в зависимости от запрашиваемой категории(выбираем нужную таблицу через UNION и выводим ее содержимое).
Но, есть одна проблема, которая портит все это дело. В борьбе с этой проблемой и прошу помощи. А проблема в следующем: Строки для пагинации просчитываются лишь по первой таблице, из всех таблиц которые прописываются через UNION. И независимо от того сколько строк в других таблицах, количество страниц отображается в постраничной навигации лишь из того расчета, сколько строк в первой по счету таблице.
Как сделать так, чтобы количество выводимых страниц просчитывалось в зависимости от того, сколько строк в таблице, которую в данный момент мы подставили под вывод?
Если нужно, могу выложить свой код.
А при определении общего числа строк в базе данных, в переменной $posts, в запросе используется UNION? Да, можете выслать код, посмотрим на примере.
Пытаюсь в который раз здесь показать код, но страница обновляется, и не сообщения, ни любого оповещения о том, отправилось ли куда, или если нет, то почему…
Может скрипт комментариев блокирует сообщения с кодом? Или как длинный текст не проходит?
Подскажите, как Ваш скрипт соединить со стандартным скриптом opencart 3?
class Pagination {
public $total = 0;
public $page = 1;
public $limit = 10;
public $num_links = 10;
public $url = »;
public $text_first = ‘|<‘;
public $text_last = ‘>|’;
public $text_next = ‘>’;
public $text_prev = ‘<‘;
/**
*
*
* @return text
*/
public function render() {
$total = $this->total;
if ($this->page page;
}
if (!(int)$this->limit) {
$limit = 10;
} else {
$limit = $this->limit;
}
$num_links = $this->num_links;
$num_pages = ceil($total / $limit);
$this->url = str_replace(‘%7Bpage%7D’, ‘{page}’, $this->url);
$output = »;
if ($page > 1) {
$output .= ‘url) . ‘»>’ . $this->text_first . ‘‘;
if ($page — 1 === 1) {
$output .= ‘url) . ‘»>’ . $this->text_prev . ‘‘;
} else {
$output .= ‘url) . ‘»>’ . $this->text_prev . ‘‘;
}
}
if ($num_pages > 1) {
if ($num_pages <= $num_links) {
$start = 1;
$end = $num_pages;
} else {
$start = $page — floor($num_links / 2);
$end = $page + floor($num_links / 2);
if ($start $num_pages) {
$start -= ($end — $num_pages);
$end = $num_pages;
}
}
for ($i = $start; $i <= $end; $i++) {
if ($page == $i) {
$output .= '’ . $i . »;
} else {
if ($i === 1) {
$output .= ‘url) . ‘»>’ . $i . ‘‘;
} else {
$output .= ‘url) . ‘»>’ . $i . ‘‘;
}
}
}
}
if ($page < $num_pages) {
$output .= 'url) . ‘»>’ . $this->text_next . ‘‘;
$output .= ‘url) . ‘»>’ . $this->text_last . ‘‘;
}
$output .= »;
if ($num_pages > 1) {
return $output;
} else {
return »;
}
}
}
Подскажите, пожалуйста, как прикрепить возможность вывода по категориям, если в таблице их несколько?
Отредактировал выборку так: $sql = «SELECT * FROM `table` WHERE cat=’$cat’ ORDER BY id LIMIT {$pgn[‘start’]}, {$pgn[‘num’]}»;
Результат: На страницах выводятся посты только по определенной категории, но количество страниц не сокращается.
Если у меня в одной из категории 30 постов, а в общей таблице 99постов, и выводится по 10 постов на странице, то как с исходником, так и с моими изменениями, все-равно делится на 10 страниц.
Но после моих изменений, после третьей(начиная с четвертой) страницы выводятся только пустые страницы, так как дальше по выбранной категории записей нет.
Как мне обрезать пустые страницы?.Чтобы количество страниц просчитывалось не от общего числа постов в таблице, а от общего количества постов в категории?
В функции pagenation, есть запрос к БД:
$sql = «SELECT count(`id`) FROM `$DBtable` $DBwhere»;
который как раз получат кол-во всех записей в БД, и на основе этого значения рассчитывает кол-во страниц.
Вызовете функцию вот так(указав в шестом параметре условия, а именно категорию):
$pgn = pagenation($_REQUEST[‘page’], 10, 10, ‘?idpost=1’, ‘table’, «cat=’$cat’», 3, $settings);