[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Постраничная навигация
xJlaIIax
Хочу Вам рассказать, как сделать не сложную, хорошую и симпатичную постраничную навигацию.

1. Первым делом создаём файл под названием config.php.
В него вносим код:

/*
* Количество записей выводимых на страницу
*/

$num = 10;

/*
* Количество выводимых страниц
*/

$height = 4;

2. Теперь добавляем код на страницу, до запроса и выборки.
Код:
/*
* Подключаем файл конфигураций
*/

include './config.php';

/*
* Проверяем является ли переменная page числом
*/

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

/*
* Подсчитываем количество строк
*/

$result = mysql_query("SELECT COUNT(*) AS `cnt` FROM `data` ", $db);
$elements = mysql_result($result, 0);

/*
* Выясняем количество страниц
*/

$total = ceil($elements / $num);

/*
* Теперь проверяем чтобы переменная page не была меньше 1 и не больше последней страницы
*/

if ($page < 1)
$page = 1;
elseif ($page > $total)
$page = $total;

/*
* Для лимита в нашем запросе, подсчитываем первый оператор, который
* показывает с какой записи мы начинаем делать выборку
*/

$start = ($page - 1) * $num;

3. Далее в конце запроса добавляем LIMIT $start, $nums.
Пример запроса и выборки:
$result = mysql_query("SELECT `name`, `txt` FROM `data` LIMIT ". $start .", ". $num, $db);

while ($row = mysql_fetch_assoc($result))
{
echo $row['name'] .'<br>'. $row['txt'] .'<br>';
}

4. Теперь после запроса и выборки выводим листинг.
Листинг:
<!-- Стиль для листинга -->
<
div class="navigation">
<?php
/*
* Определяем крайнего левого и правого соседей
*/

$left = $page - $height;

if ($left < 1)
$left = 1;

$right = $page + $height;

if ($right > $total)
$right = $total;

/*
* Выводим листинг
*/

if ($page > 1)
echo ' <a href="?page=1">начало</a> ... <a href="?page='. ($page - 1) .'">←сюда</a> ';


for ($i = $left; $i <= $right; ++$i)
{
if ($i != $page)
echo ' <a href="?page='. $i .'">'. $i .'</a> ';
else
echo ' <b>'. $i .'</b> ';
}

if ($page < $total)
echo ' <a href="?page='. ($page + 1) .'">туда→</a> ... <a href="?page='. $total .'">конец</a> ';

?>
<!-- Закрываем стиль для листинга -->
</
div>

5. Далее нужно добавить к файлу стилей сайта стиль для листинга
Стиль:
.navigation 
{
font-family:Tahoma; /* Шрифта для текстов и номеров */
text-align:center; /* Выравниваем листинг по центру */
}

.navigation a:link,
.navigation a:visited,
.navigation a:hover,
.navigation a:active
{
text-decoration:none; /* Отмена подчёркиваний у ссылок */
color:#000; /* Цвета ссылок */
background-color:#fff; /* Цвета блоков в случае, если картинка не найдена */
background-image:url(nav.gif); /* Фоновое изображение */
padding:3px 6px; /* Отступы для формирования блоков */
font-size:12px; /* Размер шрифта ссылок */
font-weight:bold; /* Полужирный шрифт ссылок */
}

/* Тоже самое, только при наведения курсора мыши */
.navigation a:hover
{
color:#000;
background-color:#fff;
background-image:url(fon.gif);
}

.navigation span
{
text-decoration:none;
color:#000;
background:#fff;
padding:3px 6px;
font-size:12px;
}

Ну вот, собственно и всё!

Так выглядит листинг:
user posted image



Спустя 2 месяца, 7 дней, 5 часов, 37 минут, 47 секунд (1.02.2011 - 16:32) Zerstoren написал(а):
Зря не реализовали как класс.
Доработал для своего Фреймворка.

Вызов происходит так

require_once('pagination.php');
$pagination = new pagination();
$pagination->elements = 150; // Количество элементов для вывода
$pagination->num = 20; // Количество ссылок на странице
$pagination->height = 4; // Количество нумерованных ссылок
echo $pagination->createLink();
// и мы получаем набор вкусных сцылочек.
// Автор спасибо за такую очень маленькую либу в 31 строку с комментами)
// Единое я переделаю структуру урлов из-за того что у меня не будет ГЕТ массивов.



<? class pagination {
public $elements;
public $num = 10;
public $height = 5;

public function createLink() {
$page = !empty($_GET['page']) ? (int)$_GET['page'] : 1;
// Выясняем количество страниц
$total = ceil($this->elements / $this->num);
// Теперь проверяем чтобы переменная page не была меньше 1 и не больше последней страницы
if ($page < 1) $page = 1;
elseif ($page > $total) $page = $total;
// Для лимита в нашем запросе, подсчитываем первый оператор, который
// показывает с какой записи мы начинаем делать выборку

$start = ($page - 1) * $this->num;
$left = $page - $this->height;
if ($left < 1) $left = 1;
$right = $page + $this->height;
if ($right > $total) $right = $total;
// Выводим листинг
$return = '';
if ($page > 1) $return .= ' <a href="?page=1">начало</a> ... <a href="?page='. ($page - 1) .'">←сюда</a> ';
for ($i = $left; $i <= $right; ++$i)
{
if ($i != $page) $return .= ' <a href="?page='. $i .'">'. $i .'</a> ';
else $return .= ' <b>'. $i .'</b> ';
}
if ($page < $total) $return .= ' <a href="?page='. ($page + 1) .'">туда→</a> ... <a href="?page='. $total .'">конец</a> ';
return $return;
}
}
?>

Спустя 1 минута, 54 секунды (1.02.2011 - 16:34) twin написал(а):
Афигеть... А понт то какой? Класс из одного метода. Типа круто?

Спустя 1 час, 23 минуты, 43 секунды (1.02.2011 - 17:58) Zerstoren написал(а):
Цитата (twin @ 1.02.2011 - 13:34)
Афигеть... А понт то какой? Класс из одного метода. Типа круто?

Не типо круто.

А как еще вы предлагаете писать библиотеки для МВЦ?
когда из контроллера нужна сделать вызов.

И еще. Зачем клиентский код растягивать?
Библиотеку должны быть растянутыми, даб выдать максимальный функционал.


Конечно каждый может запихнуть в класс. Но порой почему бы одному человеку не переписать идею автора под общие нужды?

Ну и еще. Что проще? Воспользоваться моей инструкцией и сделать просто копипаст или разбираться в далеко популярном методе?

Спустя 1 час, 3 минуты, 34 секунды (1.02.2011 - 19:01) twin написал(а):
Ну если писать класс, то так. А тут как раз выборка была, для того, что бы упростить.
А пихать один метод в класс... Ради каких то там непонятных принципов...
Это просто функция, не более того. И вызвать можно откуда угодно.

Спустя 1 день, 5 часов, 18 минут, 4 секунды (3.02.2011 - 00:20) @dmir@l написал(а):
wacko.gif

Спустя 4 дня, 17 часов, 8 минут, 39 секунд (7.02.2011 - 17:28) stas93god написал(а):
Когда нажимаю на 2 страницу не показывает продолжения, "в тейбл нет записей".

я эту строчку не могу понять
/*    
* Подсчитываем количество строк
*/
$result = mysql_query("SELECT COUNT(*) AS `cnt` FROM `data` ", $db);
$elements = mysql_result($result, 0);


Скажите я правильно вставил эту строчку?
$result = mysql_query("SELECT `name`, `txt` FROM `data` LIMIT ". $start .", ". $num, $db);

Сюда
$result = mysql_query("SELECT id,title,description,date,author,mini_img,view FROM data WHERE cat='$cat' LIMIT ". $start .", ". $num, $db);

Спустя 19 дней, 19 часов, 17 минут, 58 секунд (27.02.2011 - 12:46) ttl написал(а):
Постраничная навигация, плодит кучу дублей, для поискового продвижения не очень хорошо.

Спустя 2 часа, 33 минуты, 6 секунд (27.02.2011 - 15:19) Семён написал(а):
Цитата (ttl @ 27.02.2011 - 13:46)
Постраничная навигация, плодит кучу дублей, для поискового продвижения не очень хорошо.

Открою секрет есть такая штука как <noindex>

Спустя 2 часа, 58 минут, 19 секунд (27.02.2011 - 18:18) VELIK505 написал(а):
<!--noindex--> правильнее. Но это яша и рамблер понимают для остальных в роботс.тхт взял да закрыл страницы

Спустя 10 дней, 1 минута, 27 секунд (7.03.2011 - 18:19) datvid написал(а):
Всем привет! Я создал сайт и не получаеться вывести статьи из бд так что бы
последняя статья выходила бы под первым номером а ранее занесеные статьи отодвигались бы назад.
И еще помогите пожалуйста как получить что бы на странице index.php выводилось бы только 10 статей...Сайт должен быть многостраничным( свыше 1000 статей)
Ниже привожу код прописанный для вывода контента.Подскажите пожалуйста где что поменять или добавить

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

<div id="content">

<?php
$table = "<table border=0 width=560px >\n";
while ($row = mysql_fetch_assoc($result))
{
$table .= "<tr>\n";

$table .= "<tr>".$row['title']."</tr>\n";
$table .= "<tr>".$row['introtext']."</tr>\n";


$table .= "</tr>\n";
}

$table .= "</table>\n";

echo $table;


?>


</div>

Спустя 10 минут, 58 секунд (7.03.2011 - 18:30) twin написал(а):
Новый вопрос - новая тема. И оформи код тегами php. Подсветка будет.

Спустя 4 минуты, 43 секунды (7.03.2011 - 18:35) datvid написал(а):
<!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" />
<title>Untitled Document</title>
</head>

<body>


<div id="content">

<?php
$table = "<table border=0 width=560px >\n";
while ($row = mysql_fetch_assoc($result))
{
$table .= "<tr>\n";

$table .= "<tr>".$row['title']."</tr>\n";
$table .= "<tr>".$row['introtext']."</tr>\n";


$table .= "</tr>\n";
}

$table .= "</table>\n";

echo $table;


?>


</div>
</body>
</html>

Спустя 41 секунда (7.03.2011 - 18:35) datvid написал(а):
Не получаеться подсветка..

Спустя 3 минуты, 46 секунд (7.03.2011 - 18:39) twin написал(а):
Я говорю - новую тему заведи. А подсветка - кнопочка php сверху.

Спустя 18 часов, 14 минут, 44 секунды (8.03.2011 - 12:54) ttl написал(а):
Цитата (Семён @ 27.02.2011 - 12:19)
Цитата (ttl @ 27.02.2011 - 13:46)
Постраничная навигация, плодит кучу дублей, для поискового продвижения не очень хорошо.

Открою секрет есть такая штука как <noindex>

Поддержу Вашу инициативу, открывать секреты. Есть такая штука Google веб-мастер и Яндекс ВМ. Где эти дубли очень хорошо просматриваются. Даже несмотря на запрет индексации в robots.txt bot google все равно по ним проходит.

Спустя 4 минуты, 50 секунд (8.03.2011 - 12:59) Zerstoren написал(а):
Цитата (ttl @ 8.03.2011 - 09:54)
Цитата (Семён @ 27.02.2011 - 12:19)
Цитата (ttl @ 27.02.2011 - 13:46)
Постраничная навигация, плодит кучу дублей, для поискового продвижения не очень хорошо.

Открою секрет есть такая штука как <noindex>

Поддержу Вашу инициативу, открывать секреты. Есть такая штука Google веб-мастер и Яндекс ВМ. Где эти дубли очень хорошо просматриваются. Даже несмотря на запрет индексации в robots.txt bot google все равно по ним проходит.

О черт - делаем генерацию Тайтлов $title.", страница ".$page
и в мета тегах добавить

<meta name="robots" content="noindex,follow" />

что говорит боту - не индексировать, но ходить по ссылкам

Спустя 3 месяца, 21 день, 2 часа, 44 секунды (29.06.2011 - 13:59) Гость_Алла написал(а):
Цитата (Семён @ 27.02.2011 - 12:19)
Цитата (ttl @ 27.02.2011 - 13:46)
Постраничная навигация, плодит кучу дублей, для поискового продвижения не очень хорошо.

Открою секрет есть такая штука как <noindex>

Больной вопрос! На моём сайте куча дублей. Большинство уже попали в индекс, смотрю вебмастер. Большинство дублей из-за постраничной навигации. Как её убрать совсем? А если нельзя, то куда именно писать <noindex> в какой файл? pagination.php? куда там надо вставить? Пожалуйста, подскажите. Сказали А, скажите Б:)

Спустя 2 часа, 32 минуты, 38 секунд (29.06.2011 - 16:32) VolDroN написал(а):
в head страниц, т.е. при страница.php?page=страница в head должен быть noindex. Т.е. if(isset($_GET['page'])).
Быстрый ответ:

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