[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Функция постраничной навигации
Игорь_Vasinsky
Написал ;) - делюсь, может кому пригодиться, очень просто интегрируется с выводом, коментарии присутствуют.
Скрин:
user posted image
Дамп для пробы(в настройках БД - paginator)
Свернутый текст

-- phpMyAdmin SQL Dump
-- version 3.2.3
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Apr 26, 2011 at 12:06 PM
-- Server version: 5.1.40
-- PHP Version: 5.2.12

SET SQL_MODE=
"NO_AUTO_VALUE_ON_ZERO";

--
-- Database: `move_string`
--

-- --------------------------------------------------------

--
-- Table structure for table `test`
--

CREATE TABLE IF NOT EXISTS `test` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`text` varchar(20) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=101 ;

--
-- Dumping data for table `test`
--

INSERT INTO `test` (`id`, `text`) VALUES
(1, 'text:1'),
(2, 'text:2'),
(3, 'text:3'),
(4, 'text:4'),
(5, 'text:5'),
(6, 'text:6'),
(7, 'text:7'),
(8, 'text:8'),
(9, 'text:9'),
(10, 'text:10'),
(11, 'text:11'),
(12, 'text:12'),
(13, 'text:13'),
(14, 'text:14'),
(15, 'text:15'),
(16, 'text:16'),
(17, 'text:17'),
(18, 'text:18'),
(19, 'text:19'),
(20, 'text:20'),
(21, 'text:21'),
(22, 'text:22'),
(23, 'text:23'),
(24, 'text:24'),
(25, 'text:25'),
(26, 'text:26'),
(27, 'text:27'),
(28, 'text:28'),
(29, 'text:29'),
(30, 'text:30'),
(31, 'text:31'),
(32, 'text:32'),
(33, 'text:33'),
(34, 'text:34'),
(35, 'text:35'),
(36, 'text:36'),
(37, 'text:37'),
(38, 'text:38'),
(39, 'text:39'),
(40, 'text:40'),
(41, 'text:41'),
(42, 'text:42'),
(43, 'text:43'),
(44, 'text:44'),
(45, 'text:45'),
(46, 'text:46'),
(47, 'text:47'),
(48, 'text:48'),
(49, 'text:49'),
(50, 'text:50'),
(51, 'text:51'),
(52, 'text:52'),
(53, 'text:53'),
(54, 'text:54'),
(55, 'text:55'),
(56, 'text:56'),
(57, 'text:57'),
(58, 'text:58'),
(59, 'text:59'),
(60, 'text:60'),
(61, 'text:61'),
(62, 'text:62'),
(63, 'text:63'),
(64, 'text:64'),
(65, 'text:65'),
(66, 'text:66'),
(67, 'text:67'),
(68, 'text:68'),
(69, 'text:69'),
(70, 'text:70'),
(71, 'text:71'),
(72, 'text:72'),
(73, 'text:73'),
(74, 'text:74'),
(75, 'text:75'),
(76, 'text:76'),
(77, 'text:77'),
(78, 'text:78'),
(79, 'text:79'),
(80, 'text:80'),
(81, 'text:81'),
(82, 'text:82'),
(83, 'text:83'),
(84, 'text:84'),
(85, 'text:85'),
(86, 'text:86'),
(87, 'text:87'),
(88, 'text:88'),
(89, 'text:89'),
(90, 'text:90'),
(91, 'text:91'),
(92, 'text:92'),
(93, 'text:93'),
(94, 'text:94'),
(95, 'text:95'),
(96, 'text:96'),
(97, 'text:97'),
(98, 'text:98'),
(99, 'text:99'),
(100, 'text:100');


Сама функция (листинг) и пример использования (стиль переделать под себя)
можно вызывать как "до" так и "после" вывода, или одновременно ;)
Свернутый текст

<?php
#Определил константы для подключения к серверу
define("HOST", "localhost");
define("USER", "root");
define("PASSWORD", "");
define("DB", "paginator");

#Соединение с сервером, выбор БД
@$link = mysql_connect(HOST, USER, PASSWORD) or die (mysql_error());
@$selectDB = mysql_select_db(DB) or die (mysql_error());
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html>
<
head>
<
meta http-equiv="content-type" content="text/html; charset=UTF-8" />
<
style type="text/css">
<!--

strong.page{
padding-left: 5px;
padding-right: 5px;
border:1px solid #EAEEF8;
background-color: #3366FF;
font-family: arial;
color:white;
font-size: 13px
}

a.page:link,
a.page:hover,
a.page:visited{
font-family: arial;
text-decoration: none;
font-size: 13px;
padding-left: 4px;
padding-right: 4px;
border:1px solid #EAEEF8;
color: #3366FF;
}
-->
</
style>
</
head>
<
body>

<?php
############################
# Постраничная навигация #
############################

/*
аргументы:
$countStrings - integer (кол-во строк на одной странице)
$showLinks - integer (кол-во линков навигации)
$nameTable - string (имя таблицы в БД, которая постранично выводится)
*/

function getNavigation($countStrings, $showLinks, $nameTable)
{
#Подсчёт строк в таблице
$queryForCount = mysql_query("SELECT * FROM `".$nameTable."`");
$count_rows = mysql_num_rows($queryForCount);

#Подсчёт кол-ва страниц
$allPages = ceil($count_rows/$countStrings);

#Проверяем на какой странице мы находимся и задаём предел для вывода из БД
global $start;

if(!$_GET['page'] OR $_GET['page'] == 1)
{
$page = 1;
$start = 0;
}
else
{
$page = (int)$_GET['page'];
$start = ($page * $countStrings) - $countStrings;
}

$end = $start + $countStrings;

#Если мы ушли далеко от первой страницы - то выведем для удобства "Gthdfz"
if($page > ceil($showLinks/2))
{
echo $firstPage = "<a class='page' href='?page=1'>Первая</a>  ";
}

#Проверяем - необходима ли ссылка "Предыдущая"
if($page != 1 AND $page > 1)
{
$prev = $page - 1;
echo $prevPage = "<a class='page' href='?page=".$prev."'>Предыдущая</a>  ";
}

#Этот кусок выводит навигацию если общее кол-во страниц и кол-во показываемых ссылок совпадает
if($showLinks >= $allPages)
{
for($i = 1; $i <= $allPages; $i++)
{
if($i == $page)
{
echo $navigation = " <strong class='page'>".$i."</strong>";
}
else
{
echo $navigation = " <a class='page' href='?page=".$i."'>".$i."</a>";
}
}
}


#Этот кусок будет строить навигацию когда кол-во страниц превышает кол-во выводимых ссылок
elseif($allPages > $showLinks)
{
#Строит навигацию для первыx SHOWLINKS ссылок
if($page <= ceil($showLinks/2))
{
for($i = 1; $i < $showLinks + 1; $i++)
{
if($i == $page)
{
echo $navigation = " <strong class='page'>".$i."</strong>";
}
else
{
echo $navigation = " <a class='page' href='?page=".$i."'>".$i."</a>";
}
}
}


#Строит навигацию когда страница между предыдущем условием и следующим (СЕРЕДИНА)
if($page - ceil($showLinks/2) > 0 AND $page <= $allPages - $showLinks)
{
for($i = $page - ceil($showLinks/2 - 1); $i <= $page + ($showLinks/2); $i++)
{
if($i == $page)
{
echo $navigation = " <strong class='page'>".$i."</strong>";
}
else
{
echo $navigation = " <a class='page' href='?page=".$i."'>".$i."</a>";
}
}
}


#Строит навигацию для последних SHOWLINKS ссылок
if($page > $allPages - $showLinks AND $page > ceil($showLinks/2))
{
for($i = ($allPages - $showLinks) + 1; $i <= $allPages; $i++)
{
if($i == $page)
{
echo $navigation = " <strong class='page'>".$i."</strong>";
}
else
{
echo $navigation = " <a class='page' href='?page=".$i."'>".$i."</a>";
}
}
}

}


#Проверяем - необходима ли ссылка "Следующий"
if($page != $allPages AND $page < $allPages)
{
$next = $page + 1;
echo $nextPage = "   <a class='page' href='?page=".$next."'>Следущая</a>";
}

#Если мы ещё далеко от последней страницы, то выведем "Последняя"
if($page <= $allPages - $showLinks)
{
echo $lastPage = "   <a class='page' href='?page=".$allPages."'>Последняя</a>";
}

}

########################################
# ВЫЗОВ ФУНКЦИИ (ПОСТРОЕНИЕ НАВИГАЦИИ) #
########################################

#getNavigation($countStrings, $showLinks, $nameTable)

#$countStrings - integer (кол-во строк на одной странице)
#$showLinks - integer (кол-во линков навигации)
#$nameTable - string (имя таблицы в БД, которая постранично выводится)

#При вызове - LIMIT ".$start.", 3"), где 3 - $countStrings
#Пример $query = mysql_query("SELECT * FROM `test` ORDER BY `id` ASC LIMIT ".(int)$start.", 3");


getNavigation(3, 11, "test");

#################
# ВЫВОД ТАБЛИЦЫ #
#################


$query = mysql_query("SELECT * FROM `test` ORDER BY `id` ASC LIMIT ".$start.", 3") or die(mysql_error());
$count_rows = mysql_num_rows($query);

if($count_rows > 0)
{
while($string = mysql_fetch_array($query))
{
$table .= "<tr><td>".$string['id']."</td>"
. "<td width='10px'></td>"
. "<td>".$string['text']."</td>"
. "<td width='10px'></td>"
. "<td>".$string['order']."</td></tr>";
}

#Построение таблицы
echo "<table>".$table."</table>";
}

mysql_close($link);
?>

</body>
</
html>


Вот исходники:
paginatorDamp.sql
paginator.php



Спустя 25 минут, 58 секунд (26.04.2011 - 10:12) ИНСИ написал(а):
Игорь_Vasinsky не плохо, но было бы хорошо если бы можно было еще и условие в запрос ставить. Допустим сейчас у тебя выбирает просто все записи с таблицы, а что если мне надо WHERE `id` = '2' ?

Цитата
$queryForCount = mysql_query("SELECT * FROM `".$nameTable."`");

Тут обработай название таблицы, на всякий ...

Это можно легко внедрить сейчас, поэтому поработай на этим.
Очень хорошо сделал.

Спустя 2 минуты, 54 секунды (26.04.2011 - 10:15) Игорь_Vasinsky написал(а):
Спасибо, вот только по твоему предложению не понял, для чего выборка по критерию, если это пагинатор а не поиск?

тем более если выборка по ID - то тут пагинатор вообще не нужен был бы, так как в большинстве случаев этот столбец auto_increment

Спустя 3 минуты, 39 секунд (26.04.2011 - 10:19) ИНСИ написал(а):
ну смотри, допустим мне надо найти статью, которая относится к категории 7. Запрос был так такой:

SELECT COUNT(`id`) FROM `{table}` WHERE `category` = '7'


У тебя, сейчас, сделать такое нельзя, можно лишь сделать:
SELECT COUNT(`id`) FROM `{table}` 

Спустя 4 минуты, 34 секунды (26.04.2011 - 10:23) Игорь_Vasinsky написал(а):
Цитата
ну смотри, допустим мне надо найти статью, которая относится к категории 7. Запрос был так такой:


Смысл понял.

Это оставим на усмотрение пользователей

т.к. этого условия может и не быть wink.gif

я думаю труда не составит дописать желающим.

Спустя 13 минут, 41 секунда (26.04.2011 - 10:37) ИНСИ написал(а):
Цитата
я думаю труда не составит дописать желающим.

Решил сделать :)

Свернутый текст
<?php
#Определил константы для подключения к серверу
define("HOST", "localhost");
define("USER", "root");
define("PASSWORD", "");
define("DB", "paginator");

#Соединение с сервером, выбор БД
$link = mysql_connect(HOST, USER, PASSWORD) or die (mysql_error());
$selectDB = mysql_select_db(DB) or die (mysql_error());
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<meta
http-equiv="content-type" content="text/html; charset=UTF-8" />
<style
type="text/css">
<!--
strong.page{
padding-left: 5px;
padding-right: 5px;
border:1px solid #EAEEF8;
background-color: #3366FF;
font-family: arial;
color:white;
font-size: 13px
}

a
.page:link,
a
.page:hover,
a
.page:visited{
font-family: arial;
text-decoration: none;
font-size: 13px;
padding-left: 4px;
padding-right: 4px;
border:1px solid #EAEEF8;
color: #3366FF;
}
-->
</style>
</head>
<body>

<?php

############################
# Постраничная навигация #
############################

/*
аргументы:
$countStrings - integer (кол-во строк на одной странице)
$showLinks - integer (кол-во линков навигации)
$nameTable - string (имя таблицы в БД, которая постранично выводится)
*/


function getNavigation($countStrings, $showLinks, $nameTable, $where)
{

#Подсчёт строк в таблице
$queryForCount = mysql_query("SELECT * FROM `".$nameTable."` " . $where);
$count_rows = mysql_num_rows($queryForCount);

#Подсчёт кол-ва страниц
$allPages = ceil($count_rows/$countStrings);

#Проверяем на какой странице мы находимся и задаём предел для вывода из БД
global $start;

if(!$_GET['page'] OR $_GET['page'] == 1)
{
$page = 1;
$start = 0;
}
else
{
$page = (int)$_GET['page'];
$start = ($page * $countStrings) - $countStrings;
}

$end = $start + $countStrings;

#Если мы ушли далеко от первой страницы - то выведем для удобства "Gthdfz"
if($page > ceil($showLinks/2))
{
echo $firstPage = "<a class='page' href='?page=1'>Первая</a> ";
}

#Проверяем - необходима ли ссылка "Предыдущая"
if($page != 1 AND $page > 1)
{
$prev = $page - 1;
echo $prevPage = "<a class='page' href='?page=".$prev."'>Предыдущая</a> ";
}

#Этот кусок выводит навигацию если общее кол-во страниц и кол-во показываемых ссылок совпадает
if($showLinks >= $allPages)
{
for($i = 1; $i <= $allPages; $i++)
{
if($i == $page)
{
echo $navigation = " <strong class='page'>".$i."</strong>";
}
else
{
echo $navigation = " <a class='page' href='?page=".$i."'>".$i."</a>";
}
}
}


#Этот кусок будет строить навигацию когда кол-во страниц превышает кол-во выводимых ссылок
elseif($allPages > $showLinks)
{
#Строит навигацию для первыx SHOWLINKS ссылок
if($page <= ceil($showLinks/2))
{
for($i = 1; $i < $showLinks + 1; $i++)
{
if($i == $page)
{
echo $navigation = " <strong class='page'>".$i."</strong>";
}
else
{
echo $navigation = " <a class='page' href='?page=".$i."'>".$i."</a>";
}
}
}


#Строит навигацию когда страница между предыдущем условием и следующим (СЕРЕДИНА)
if($page - ceil($showLinks/2) > 0 AND $page <= $allPages - $showLinks)
{
for($i = $page - ceil($showLinks/2 - 1); $i <= $page + ($showLinks/2); $i++)
{
if($i == $page)
{
echo $navigation = " <strong class='page'>".$i."</strong>";
}
else
{
echo $navigation = " <a class='page' href='?page=".$i."'>".$i."</a>";
}
}
}


#Строит навигацию для последних SHOWLINKS ссылок
if($page > $allPages - $showLinks AND $page > ceil($showLinks/2))
{
for($i = ($allPages - $showLinks) + 1; $i <= $allPages; $i++)
{
if($i == $page)
{
echo $navigation = " <strong class='page'>".$i."</strong>";
}
else
{
echo $navigation = " <a class='page' href='?page=".$i."'>".$i."</a>";
}
}
}

}


#Проверяем - необходима ли ссылка "Следующий"
if($page != $allPages AND $page < $allPages)
{
$next = $page + 1;
echo $nextPage = " <a class='page' href='?page=".$next."'>Следущая</a>";
}

#Если мы ещё далеко от последней страницы, то выведем "Последняя"
if($page <= $allPages - $showLinks)
{
echo $lastPage = " <a class='page' href='?page=".$allPages."'>Последняя</a>";
}

}

########################################
# ВЫЗОВ ФУНКЦИИ (ПОСТРОЕНИЕ НАВИГАЦИИ) #
########################################

#getNavigation($countStrings, $showLinks, $nameTable)

#$countStrings - integer (кол-во строк на одной странице)
#$showLinks - integer (кол-во линков навигации)
#$nameTable - string (имя таблицы в БД, которая постранично выводится)

#При вызове - LIMIT ".$start.", 3"), где 3 - $countStrings
#Пример $query = mysql_query("SELECT * FROM `test` ORDER BY `id` ASC LIMIT ".$start.", 3");


$whereQuery = "WHERE `id` = '7'";
getNavigation(3, 11, "test", $whereQuery);

#################
# ВЫВОД ТАБЛИЦЫ #
#################


$query = mysql_query("SELECT * FROM `test` {$whereQuery} ORDER BY `id` ASC LIMIT ".(int)$start.", 3") or die(mysql_error());
$count_rows = mysql_num_rows($query);

if($count_rows > 0)
{
while($string = mysql_fetch_array($query))
{
$table .= "<tr><td>".$string['id']."</td>"
. "<td width='10px'></td>"
. "<td>".$string['text']."</td>"
. "<td width='10px'></td>"
. "<td>".$string['order']."</td></tr>";
}

#Построение таблицы
echo "<table>".$table."</table>";
}

mysql_close($link);
?>

</body>
</html>

Спустя 6 минут, 7 секунд (26.04.2011 - 10:43) Игорь_Vasinsky написал(а):
НУ в принципе, до универсалил wink.gif


Спустя 1 минута, 30 секунд (26.04.2011 - 10:45) Семён написал(а):
Честно говоря - плоховато.

Спустя 1 минута, 56 секунд (26.04.2011 - 10:46) Игорь_Vasinsky написал(а):
Семён
я именно на такое твоё мнение и расчитывал wink.gif
давай рассказывай, подробней, буду работать.

Спустя 1 час, 22 минуты, 14 секунд (26.04.2011 - 12:09) Семён написал(а):
Закрывая глаза SQL запросы в классе/функции, стоило бы обратить хотябы внимание на исключение элементов вёрстки из кода.

Спустя 19 минут, 50 секунд (26.04.2011 - 12:29) Игорь_Vasinsky написал(а):
Семён
так там только ссылки, для которых впринципе функция и работает.
а SQL - необходим для подсчёта кол-ва строк.

Я же говорю, при желании внутри функции код можно менять под себя. Но в большенстве случаев - я думаю именно такой нужен.

Надоб чтоб эксперты взглянули, мжет посчитают нужным закрепить на денёк...

Спустя 14 минут, 6 секунд (26.04.2011 - 12:43) ИНСИ написал(а):
Цитата
мжет посчитают нужным закрепить на денёк...

Закрепил на пару дней, а может и дольше smile.gif

Спустя 31 секунда (26.04.2011 - 12:43) Семён написал(а):
Вот тебе пример Paginatora к примеру, который делал недавно для Коханы:
class Pagination {

public $config;

public function getData() {
$this->generateOptions();
return $this->selectData();
}

private function generateOptions() {
//Получим общее кол-во записей:
$this->config['total'] = $this->selectCount();
//Вычислим принадлежность страницы к паре:
$this->config['part'] = ceil($this->config['current'] / $this->config['break']);
//Посчитаем кол-во страниц:
$this->config['total_pages'] = ceil($this->config['total'] / $this->config['limit']);
//Устанавливаем начальную страницу
$this->config['begin'] = (($this->config['part'] - 1) * $this->config['break']) + 1;
//Устанавливаем конечную страницу
$this->config['end'] = (($this->config['break'] * $this->config['part']) > $this->config['total_pages']) ? $this->config['total_pages'] : $this->config['break'] * $this->config['part'];
//Установим ссылки переходов
$this->config['link_back'] = ($this->config['current'] > $this->config['break']) ? 1 : 0;
$this->config['link_next'] = ($this->config['end'] >= $this->config['total_pages']) ? 0 : 1;
//Получим offset:
$this->config['offset'] = $this->config['limit'] * ($this->config['current']-1);
}

public function selectData() {
return $this->config['data_request']->offset($this->config['offset'])->limit($this->config['limit'])->execute()->as_array();
}

private function selectCount() {
return $this->config['count_request'];
}

public function getView() {
$view = Kohana_View::factory('pagination/view');
$view->bind('paginator',$this->config);
return $view;
}
}

Спустя 5 минут (26.04.2011 - 12:48) Игорь_Vasinsky написал(а):
Классссссы..... РрРрРрРр.....

а моё детище одним инклудом вписал - ипользуйся...

не все с классами работать умеют... и Серёжа Игорёша тоже sad.gif

Вот и сразу явное приемущество - простая интеграция wink.gif

Спустя 1 минута, 40 секунд (26.04.2011 - 12:50) Игорь_Vasinsky написал(а):
Так мы с тобой долго спорить будем можем... пусть смотрят комментируют.

Твою позицию я понял. wink.gif


Тему закрепили..

Время будет, планирую дописать:

- добавить выбор стиля пагинатора: google, yandex и кто нить третий....

Спустя 1 минута, 19 секунд (26.04.2011 - 12:51) Семён написал(а):
Т.е. хочешь сказать что у тебя будет простая интеграция?!
Куда ты пробовал интегрировать свою постраничку брррр в свой скрипт? чтобы утверждать что просто? ) Банально, у меня в проекте будет класс для работы с БД, и стили будут перебивать твою вёрстку, мне что лезть переписывать SQL запросы и html элементы? )))) laugh.gif

Спустя 10 минут, 14 секунд (26.04.2011 - 13:01) Игорь_Vasinsky написал(а):
Цитата
Т.е. хочешь сказать что у тебя будет простая интеграция?!
Куда ты пробовал интегрировать свою постраничку брррр в свой скрипт? чтобы утверждать что просто? ) Банально, у меня в проекте будет класс для работы с БД, и стили будут перебивать твою вёрстку, мне что лезть переписывать SQL запросы и html элементы? )))) 



Ты вот зачем себе такую рпутацию создаёшь ? споришь и споришь...
как будто тут всего 2 мнения - твое и не правильное...

Я постарался всё раскомментировать там.. чтоб человеку было понятно как и что и где.

Если он не знает как SQL запрос подправить - то нужно оно ему всё это ? я думаю - найдёт другой вариант и уж точно не ввиде класса.




Спустя 6 минут, 32 секунды (26.04.2011 - 13:08) Семён написал(а):
Игорь_Vasinsky, та репутация, которую ты считаешь, что я создаю уже давно создана ))) Критику нужно воспринимать и когда на твоём пути встаёт такая какашка как я и критикует тебя, старайся отстоять свою правоту и доказать.
Когда сказал, что плохо, тебя заинтересовало, что же там может быть плохого в моём идеальном коде? ))) Я тебе ответил, но ты по прежнему считаешь, что это нормально и универсально. Я тож знаешь далеко умом не блещу и всегда был бы рад, чтобы тот-же twin надавал мне подзатыльников )))) Это так приятно видеть свои пробелы!

Спустя 3 минуты, 56 секунд (26.04.2011 - 13:12) Игорь_Vasinsky написал(а):
Цитата
чтобы тот-же twin надавал мне подзатыльников )))) Это так приятно видеть свои пробелы!

это больно.... до шишок.


а по поводу всего остального - у меня для тебя один только аргумент:

человек который знает как работать с функциями не обязан уметь работать с классами.

И мне кажется именно это утверждение должно поставить точку в этой теме: чей код легко интегрирован.

Давай оставим места в теме для других...

Спустя 56 секунд (26.04.2011 - 13:13) Семён написал(а):
Твоё дело ) я тебя не хотел обидеть.

Спустя 35 секунд (26.04.2011 - 13:13) Игорь_Vasinsky написал(а):
да не. wink.gif

Спустя 39 минут, 7 секунд (26.04.2011 - 13:52) Nikitian написал(а):
А что будет, если страниц 100500?
Вот пагинатор в одну функцию (выпилил из более обобщённого класса)

/**
* Генерациястроки перехода по страницам
*
@param int $count количество страниц
*
@param int $current текущий элемент
*
@param string $url урл, на который ссылаются. &id& заменяется на порядковый номер элемента http://site.ru/page%id&.html
* @param bool $nextpreview далее-назад.default=false
*
@param bool $firstlast в начало-в конец.default=false
*
@param char $separator разделитель элементов.default=' '
*
@param int $view количество элементов, которые показывать
*
@return string
*
@author Nikitian
*/

function pageline($count,$current,$url,$nextpreview=false,$firstlast=false,$separator=' ',$view=6){
if($view>$count)$view=$count;
$str=array();
if($count<=$view){
for($i=1;$i<=$view;$i++)if($current!=$i)$str[]='<a href="'.str_replace('&id&',$i,$url).'">'.$i.'</a>';else$str[]='<a href="'.str_replace('&id&',$i,$url).'" class="active">'.$i.'</a>';
}
elseif($current<=$count && $current>=1){
$length=$view-2;
$from=intval($current-($length/2));
if($from<2)$from=2;
$to=$from+$length;
if($to>=$count){
$from=$count-$length-1;
$to=$count-1;
}
if($current!=1)$str[]='<a href="'.str_replace('&id&',1,$url).'">1</a>'.($from>2?'...':'');else$str[]='<a href="'.str_replace('&id&',1,$url).'" class="active">1</a>';
for($i=$from;$i<=$to;$i++)if($current!=$i)$str[]='<a href="'.str_replace('&id&',$i,$url).'">'.$i.'</a>';else$str[]='<a href="'.str_replace('&id&',$i,$url).'" class="active">'.$i.'</a>';
if($current!=$count)$str[]=($to<($count-1)?'<span>...</span>':'').'<a href="'.str_replace('&id&',$count,$url).'">'.$count.'</a>';else$str[]='<a href="'.str_replace('&id&',$count,$url).'" class="active">'.$count.'</a>';
}
else return false;
$str=implode($separator,$str);
if($nextpreview)$str=($current!=1 ? ('<a href="'.str_replace('&id&',($current-1),$url).'">← Назад</a>'.$separator):'').$str.($current!=$count ? ($separator.'<a href="'.str_replace('&id&',($current+1),$url).'">Далее →</a>'):'');
if($firstlast)$str=($current!=1 ? ('<a href="'.str_replace('&id&',1,$url).'">«« В начало</a>'.$separator):'').$str.($current!=$count ? ($separator.'<a href="'.str_replace('&id&',$count,$url).'">В конец »»</a>'):'');
return '<div class="paginator"><span>Страницы:</span>'.$str.'</div>';
}

//Использование
echo pageline(200,50,'/gotopage/&id&/');

Написал пару лет назад, до сих пор без переделок пользуюсь.

Спустя 14 минут, 16 секунд (26.04.2011 - 14:07) Игорь_Vasinsky написал(а):
Цитата
А что будет, если страниц 100500?


сломал голову... а что будет?, по моему предположение ни чего страшного. Или в чём подвох?

Спустя 3 минуты, 45 секунд (26.04.2011 - 14:10) Nikitian написал(а):
А, не, всё нормально. Второй скриншот не разглядел.

Спустя 3 дня, 17 часов, 30 минут, 37 секунд (30.04.2011 - 07:41) ИНСИ написал(а):
Игорь_Vasinsky чет, никто не отписывается. Снимаю sad.gif

Спустя 4 минуты, 1 секунда (30.04.2011 - 07:45) Игорь_Vasinsky написал(а):
Да... уж дней 7 тишина... лан. Есть в разделе, поисковики шарят.. снимай. wink.gif

Спустя 3 месяца, 8 дней, 12 часов, 52 минуты, 1 секунда (8.08.2011 - 20:37) dropoff написал(а):
Не могу что-то разобраться как правильно убрать echo, чтобы выводить в нужном мне месте. У меня вывод через smarty.
с выводом разобрался.

А как быть, если нужно две пагинации на странице выводить?

Как-то малость не удобно.
Я еще получаю $allPages для того, чтобы можно было при добавлении материала с любой странице редиректить в конец. как на форуме. Если добавить сообщение в начале темы, то после постинга перекидывает на твое сообщение в самом конце.

так же сделал еще в качестве аргумента передачу УРЛа и подставил к ссылкам
потом через str_replace убиваю ?page=1, чтобы первая страница не дублировалась.

Работает нормально, но как-то не приятно юзать глобальные переменные.

Оформить бы в виде класса. было бы удобнее! Жаль нубоват я в этом деле))

Спасибо за функцию.

Спустя 5 месяцев, 23 дня, 1 час, 2 минуты, 56 секунд (31.01.2012 - 21:40) Shkiper написал(а):
Здаров Игорь! Скачал исходники все работает все норм навигация biggrin.gif Только вот небольшая неувязочка!! Там идет подсчет кол-во записей в БД а потом строиться меню и выводиться определенные новости!!!! А как делать так если мне надо вывести только те где в поле public стоит 1 я сделал это с помощью where все работает но только не выводит например если я на первой то не выводит ссылку Последняя или на оборот что делать???

Спустя 32 минуты, 32 секунды (31.01.2012 - 22:13) inpost написал(а):
Deert
А тебе не кажется, что чтобы пользоваться скриптами, тебе надо понимать, что они делают, а не заниматься тупым копи-пастом?

Спустя 3 минуты, 36 секунд (31.01.2012 - 22:16) Игорь_Vasinsky написал(а):
весь алгоритм завязан так

если первая в зоне видимости - то "первая" не покажеться
если последняя в зоне видимости - то "последняя" не покажеться


     #Если мы ушли далеко от первой страницы - то выведем для удобства "Gthdfz"  
if($page > ceil($showLinks/2))
{
echo $firstPage = "<a class='page' href='?page=1'>Первая</a> ";
}


замени на

echo $firstPage = "<a class='page' href='?page=1'>Первая</a>  ";


и она всегда будут присутствовать в навигации...



или ты про что?


надож.. помню ещё.. сам то давно на аяксовом пагинаторе))

Спустя 5 дней, 1 час, 14 минут, 33 секунды (6.02.2012 - 23:31) kulinar написал(а):
Спасиб за скрипт!
у меня тут маленькая неувязочка когда "инклудаю") файл навигации из другой папки работает но вместо русских слов абракадабра..
кто знает как решить проблему ? спасибо.
(без include одним файлом русские символы отображаются правильно)

Спустя 4 часа, 26 минут, 40 секунд (7.02.2012 - 03:57) Игорь_Vasinsky написал(а):
заголовок с кодировкой посылай (header)
после соединения с бд
mysql_query("SET NAMES 'utf-8'");


пагинатор тут не причём ;)

Спустя 10 часов, 11 минут, 39 секунд (7.02.2012 - 14:09) kulinar написал(а):
добавил -
mysql_query("SET NAMES 'windows-1251'");          
mysql_query("SET CHARACTER SET 'windows-1251'" );

ситуацията же, utf-8 тоже ничего не изменил ((

Спустя 6 минут, 4 секунды (7.02.2012 - 14:15) Winston написал(а):
Цитата (kulinar @ 7.02.2012 - 13:09)
SET NAMES 'windows-1251

Так не пишут, нужно так
mysql_query("SET NAMES cp1251");

Спустя 3 минуты, 12 секунд (7.02.2012 - 14:18) Bodich написал(а):
 mysql_query("SET NAMES cp1251");          
mysql_query("SET CHARACTER SET cp1251'" );

ничего не дало вподключаемом файле абракадабра

Спустя 3 минуты, 20 секунд (7.02.2012 - 14:22) Winston написал(а):
Заголовок (header()) выставлен в файле?
Кодировка файла точно UTF-8 Without BOM?
Цитата (Bodich @ 7.02.2012 - 13:18)
ничего не дало вподключаемом файле абракадабра

Какая абракадабра? Каракули или ромбики?

Спустя 3 минуты, 37 секунд (7.02.2012 - 14:25) Игорь_Vasinsky написал(а):
погоди)))

у тя данные в какой кодировке в БД?
сами файлы в какой кодировке?

Спустя 17 минут, 10 секунд (7.02.2012 - 14:42) Bodich написал(а):
Следущая Последняя

MySQL connection collation : utf8_general_ci

Сервер: povarec.mysql.ukraine.com.ua via TCP/IP
Версія сервера: 5.1.56-log
Protocol version: 10
Користувач: povarec_db@91.206.200.55
MySQL Charset: UTF-8 Unicode (utf8)

а как узнать в какой кодировке фали ((

Спустя 5 минут, 23 секунды (7.02.2012 - 14:48) Winston написал(а):
Цитата (Bodich @ 7.02.2012 - 13:42)
Следущая Последняя

Такие символы выводятся когда кодировка файла UTF-8, а такой заголовок
header("Content-Type: text/html; charset=utf-8");

Не прописан. Потому пропиши его.

Спустя 13 минут, 29 секунд (7.02.2012 - 15:01) Bodich написал(а):
у меня вся коировка сайта в windows-1251
пробывал в шапке поставить header("Content-Type: text/html; charset=utf-8");--
ниче неотображается правильно кроме навигации

написал в начале файла navig_pre_view.inc.php

header("Content-Type: text/html; charset=utf-8");
ничего не изменилось

Спустя 5 минут, 41 секунда (7.02.2012 - 15:07) Winston написал(а):
Цитата (Bodich @ 7.02.2012 - 14:01)
у меня вся коировка сайта в windows-1251

Цитата (Bodich @ 7.02.2012 - 13:42)
MySQL connection collation : utf8_general_ci

Цитата (Bodich @ 7.02.2012 - 13:42)
MySQL Charset: UTF-8 Unicode (utf8)

Ёпрст :wacko: Почему нельзя все сделать в одной кодировке???
Теперь отвечай мне на вопросы:
1) У тебя при соединении с базой прописано?
mysql_query("SET NAMES cp1251");          

2) Сам файл в котором коннект прописан, в какой кодировке? (Если не знаешь, открой notepad++ -> меню кодировки)
3) Файл в котором ты инклюдишь файл коннекта в какой кодировке? Если windows-1251, то и заголовок с такой же кодировкой нужно прописывать
header("Content-Type: text/html; charset=windows-1251");

Спустя 18 минут, 32 секунды (7.02.2012 - 15:26) Bodich написал(а):
файл коннекта
header("Content-Type: text/html; charset=windows-1251");


$db=mysql_connect("povarec.mysql.ukraine.com.ua","********","********");
mysql_select_db("povarec_db",$db);
mysql_query("SET NAMES cp1251");

файл инклюда
<?php
header("Content-Type: text/html; charset=windows-1251");
echo '<div align="center">';
// вивод постраничной навигации:

############################
# Постраничная навигация #
############################


/*аргументы:
$countStrings - integer (кол-во строк на одной странице)
$showLinks - integer (кол-во линков навигации)
*/
$nameTable = 'data';


файл куда подключается через инклюд
    
include("BD.php");
header("Content-Type: text/html; charset=windows-1251");

require_once "func/query.php";



if (isset($_GET['podcat'])) {$podcat=$_GET['podcat'];}
if (isset($_GET['cat_number'])) {$cat_number=$_GET['cat_number'];}


Спустя 1 минута, 54 секунды (7.02.2012 - 15:27) Winston написал(а):
А сами файлы ты уверен, что они в windows-1251?

Спустя 7 минут, 25 секунд (7.02.2012 - 15:35) Bodich написал(а):
фуххх поменял кодировку самого фала в phpDesigner залил и все норм
СПАСИБО за помощь!!!

Спустя 1 минута, 8 секунд (7.02.2012 - 15:36) Winston написал(а):
Ну наконец-то smile.gif

Спустя 22 минуты, 22 секунды (7.02.2012 - 15:58) Игорь_Vasinsky написал(а):
Цитата
Ёпрст wacko.gif Почему нельзя все сделать в одной кодировке???
biggrin.gif

Спустя 7 часов, 46 минут, 47 секунд (7.02.2012 - 23:45) Bodich написал(а):
еще проблемка,к странице подключен яваскрипт
<script language="javascript" type="text/javascript" src="Scripts/podskazka.js"></script>
при переходе по навигации на страницу 2 и тд яваскрипт не работает(((

Спустя 1 минута, 32 секунды (7.02.2012 - 23:47) inpost написал(а):
Bodich
Дом дерево не перестраивается при подключении аяксом новых данных. Это особенность JS. Для этого необходимо вручную создавать объекты, на которые ссылается твоя подсказка.

Спустя 12 минут, 45 секунд (7.02.2012 - 23:59) redreem написал(а):
Цитата
Дом дерево не перестраивается при подключении аяксом новых данных


перестраивается.

Спустя 12 часов, 48 минут, 59 секунд (8.02.2012 - 12:48) Bodich написал(а):
так что, скрипты не работают при переходе по навигации ? sad.gif

Спустя 1 день, 11 часов, 54 минуты, 57 секунд (10.02.2012 - 00:43) Bodich написал(а):
Работает smile.gif

Спустя 6 часов, 14 минут, 19 секунд (10.02.2012 - 06:58) Игорь_Vasinsky написал(а):
канешь работают, DOM тот же а данные просто другие.

Спустя 1 месяц, 10 дней, 6 часов, 12 минут, 33 секунды (20.03.2012 - 13:10) Проша написал(а):
Вот мой вариант

$allRecords = 100;
$userPage = $_GET['page'];

function pages($allRecords, $userPage)
{
$allPages = ceil($allRecords/10); // всего страниц
$allRecords = $allPages * 10; // округленное количество записей в БД

if ($userPage > $allPages) $userPage = 1;

// кнопка "назад"
if ($userPage > 1) $pages['back'] = $userPage * 10 - 20;

$pages[1] = 0; // запоминаем первую страницу

if (($userPage - 1) > 4) // нужно ли отобразить страницы "слева" от выбранной
{
$pages['.'] = '...';
$arr = nearPages($userPage - 3, $userPage, $pages);
}

if ((($userPage - 1) <= 4)&&(($userPage - 1) != 0))
{
$arr = nearPages(2, $userPage, $pages);
}

$arr[$userPage] = $userPage * 10 - 10; // выбранная пользователем страница

if (($userPage + 4) < $allPages) // страницы "справа"
{
$arr = nearPages($userPage + 1, $userPage + 4, $arr);
$arr['.'] = '...';
}

if (($userPage + 4) >= $allPages)
{
$arr = nearPages($userPage + 1, $allPages, $arr);
}

$arr[$allPages] = $allPages * 10 - 10; // последняя страница
// ссылка "вперед"

if (($userPage + 1) <= $allPages) $arr['next'] = $userPage * 10;
return $arr;
}


function nearPages($beginPage, $endPage, $pages)
{
for ($i = $beginPage; $i < $endPage; $i ++)
{
$pages[$i] = $i * 10 - 10;
}
return $pages;
}

$pages = pages($allRecords, $userPage);

foreach($pages as $index => $value)
{
if ($index <> '.')
{
echo "<a href='pages.php?page=" . $value . "'>[" . $index . "]</a>";
}
else
{
echo " ... ";
}
}

Спустя 1 месяц, 9 дней, 18 часов, 38 минут, 56 секунд (30.04.2012 - 07:49) Игорь_Vasinsky написал(а):
нужно было тему создать)))

Спустя 1 день, 13 часов, 6 минут, 55 секунд (1.05.2012 - 20:56) bposter написал(а):
Не дает скачать php файл пишит Access denied for user 'root'@'localhost' (using password: NO)

Спустя 2 минуты, 16 секунд (1.05.2012 - 20:58) Игорь_Vasinsky написал(а):
да. хостинг ж сменил))

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

Спустя 1 день, 3 часа, 40 минут, 17 секунд (3.05.2012 - 00:39) Гость_Вася написал(а):
и я писал пользуйтесь комментируйте плюсы минусы

empty($_GET['page']) ? $page = 1 : $page = $_GET['page'];

$page-- > 2 ? $page-- : $page; $page == 0 ? $page = 1 : $page;

print $_GET['page'].'<br>';

$num = ceil(500 / 20);

if ($page > 3) {

print '<a href = "test.php?page=1"
style = "font-weight: bold; text-decoration: none;" >&laquo;</a>';

}

for ($page; $page <= $num; $page++) { $end++;

if ($page != $_GET['page']) {

print '&nbsp;<a href = "test.php?page='.$page.'" style = "font-weight: bold; text-decoration: none;" >'.$page.'</a>&nbsp;';

} else if ($page == $_GET['page']) {

print '&nbsp;<font style = "font-weight: bold; text-decoration: underline;" >'.$page.'</font>&nbsp;';

}

if ($end == 5) {break;}

}

if ($page < $num - 3) {

print '<a href = "test.php?page='.$num.'"
style = "font-weight: bold; text-decoration: none;" >&raquo;</a>';

}

Спустя 22 дня, 16 часов, 16 минут, 18 секунд (25.05.2012 - 16:55) Guest написал(а):
wink.gif :lol ph34r.gif : dry.gif sad.gif smile.gif :un ohmy.gif sure: blink.gif ph34r.gif huh.gif biggrin.gif laugh.gif user posted image user posted image user posted image

Спустя 3 часа, 15 минут, 50 секунд (25.05.2012 - 20:11) Игорь_Vasinsky написал(а):
не флудить! пример пагинатора в этой теме на http://hdkinozavr.ru

Спустя 6 дней, 21 час, 2 минуты, 44 секунды (1.06.2012 - 17:13) vadimk написал(а):
user posted image
Использование:
pagination("Адрес-до-номера-страницы", Общее-кол-во-страниц, Текущая-страница);

Пример:
pagination("?p=", $count, $_GET[p]);



Код функции:
<?
function
pagination($addr, $count, $page){
if($page=='')$page=1;
$bold[$page][s]="<b>";
$bold[$page][e]="</b>";
if($count>1){
echo('<a href="'.$addr.'1">'.$bold[1][s].'1'.$bold[1][e].'</a> | ');
if($page-5>2)echo('... | ');
for($i=$page-5;$i<=$page+5;$i++){
if($i>1&$i<$count)echo('<a href="'.$addr.''.$i.'">'.$bold[$i][s].''.$i.''.$bold[$i][e].'</a> | ');
}
if($page+5<$count-1)echo('... | ');
echo('<a href="'.$addr.''.$count.'">'.$bold[$count][s].''.$count.''.$bold[$count][e].'</a>');}}
?>

Спустя 2 месяца, 27 дней, 14 часов, 30 минут, 14 секунд (29.08.2012 - 07:44) Игорь_Vasinsky написал(а):
Цитата
if($page=='')$page=1;

1я строка и сразу косячина.


_____________
HTML, CSS (Bootstrap), JS(JQuery, ExtJS), PHP, MySQL, MSSql, Posgres, (TSql, BI OLAP, MDX), Mongo, Git, SVN, CodeIgnater, Symfony, Yii 2, JiRA, Redmine, Bitbucket, Composer, Rabbit MQ, Amazon (SQS, S3, Transcribe), Docker
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.