Реализуем постраничную навигацию на нашем блоге

 

Доброго всем дня! Спасибо что заглянули на мой блогУлыбаюсьСегодня я хочу поговорить с Вами о панели навигации на нашем блоге. Как известно на всех интернет дневниках, на главной странице выводится лишь по 5-10 заметок, все остальное находится на других страницах, перейти на которые можно щелкнув по панели навигации, которая обычно находится в нижней части интернет проекта. Как добиться подобного функционала?

Что-то подобное мы уже делали, когда реализовывали менеджер файлов в админ панели. Но там нам приходилось сканировать количество файлов в папке, а не записей в базе данных. Да и сама панели навигации не блещет функционалом.

Ладно, давайте сначала поговорим о том как наша панель должна работать, после чего я дам Вам за комментированный код модуля (комментариев в коде очень много Смеюсь)

 

 

Способ вывода необходимой информации из базы данных

 

Начну пожалуй с того как именно выводить из базы данных нужные заметки. Тут все довольно просто. Ранее мы работали с такой чудо-штукой как LIMIT для запроса SELECET. Лимит позволяет выводить определенное количество строк из базы данных. В данный момент наша главная страница блога выводит 10 заметок именно с помощью этой чудо-штуки Улыбаюсь

$result_index = mysql_query("SELECT * FROM blog ORDER BY id DESC LIMIT 10");

Но у лимит есть еще одна очень удобная возможность. Можно указать с какой позиции (строчки в базе данных) начинать выводить определенное количество заметок. Например можно написать вот так

$result_index = mysql_query("SELECT * FROM blog ORDER BY id DESC LIMIT 0, 10");

В этом случае мы получим тот же результат, что и с помощью предыдущего запроса, но используя начальную позицию.

Как вы уже наверное догадались, навигация именно так и работает. Пользователь переходя на страницу номер 2, запрашивает у скрипта заметки не с нулевой позиции, а с десятой

$result_index = mysql_query("SELECT * FROM blog ORDER BY id DESC LIMIT 10, 10");

тем самым на экране он увидит заметки с 10 по 20-ую позицию.

Задача нашего модуля, опираясь на открытую страницу рассчитать с какой именно позиции выводить необходимые 10 заметок.

 

Панели навигации, как выглядит, какой имеет функционал?

 

Как уже сказал выше, задача модуля рассчитать с какой позиции необходимо выводить нужные заметки. Для того чтобы рассчитать это, скрипту необходимо будет целое число (номер страницы) задать которое возлагается на плечи пользователя Улыбаюсь Для того чтобы облегчить задачу пользователя в определения данного целого числа мы нарисуем для него панель навигации (в общем то эта задача самая сложна). Выглядит эта панель вот так:

 

панель навигации

 

Для того чтобы Вы поняли комментарии которые я оставил в коде, должен пояснить пару деталей. Я разделил данную панель на три глобальных элемента:

  1. Левая часть
  2. Центральная часть
  3. Правая часть

 

элементы панели

 

Центральную часть панели я поделил на три элемента:

  1. Левая центральная часть панели
  2. Центральная часть центральной панели (она же не активная кнопка или открытая страница)
  3. Правая часть центральной части панели

 

элементы центральной части панели

 

Генерация панели будет производится от самого центра, то есть от центральной части центральной панели. В центральной части может находится любое количество активных кнопок (по умолчанию их 6). Но желательно что бы это было четное число, так как в центре активных кнопок будет добавлено еще одна, не активная кнопка (по умолчанию в центральной панели будет 6 активных кнопок плюс одна не активная, и того семь кнопок)

Появление левой и правой части панели будет зависеть от того сколько всего страниц, и какая именно страница открыта.

В общем то все что нужно я уже сказал, можно приступать к реализации, но сразу после объявления для новоприбывших Улыбаюсь

 

Для тех кто на блоге в первый раз

 

Если Вы на моем блоге в первый раз, то не проходите мимо данного пункта. Вы вряд ли поняли чем мы тут занимаемся, поэтому слушайте Улыбаюсь Данная заметка является частью глобального цикла по реализации своего простенького движка персонального блога "Создать блог с нуля". Цикл статей уже выходит на финишную прямую, нам осталось реализовать совсем ничего, после чего я поделюсь копией движка с уже отловленными (большую часть) багами.

Смысл всего этого в том, что бы понять как работает простой скрипт интернет проекта, после чего увидеть копию полностью рабочего движка, в котором почти каждая строчка Вам известна. Данное знание позволит Вам создать что-то свое, что-то то что удовлетворяло бы Вас на все 100%

Если данная тематика Вам интересна, то переходите вот по этой ссылке и приступайте к изучению изложенного мной материала.

Если Вы собираетесь задержаться на моем блоге, то обязательно подпишитесь на RSS ленту блога через ридер, или же по почте. Так Вы не пропустите новые заметки цикла, ну или какую-нибудь другую интересную информацию Улыбаюсь

 

Что необходимо сделать?

 

Думаю необходимо перечислить список файлов которые нам нужно будет создать или отредактировать:

  • Модуль навигации navig.php. Модуль будет состоять из трех функций.
    • функция navig(). Позволит понять скрипту с какой именно позиции необходимо выводить информацию из базы данных.
    • listnav(). Сформирует панель навигации
    • linkBLOCK(). Функция-помощник для функции listnav(). Функция будет оборачивать данные html кодом.
  • news.php. Добавим вызов новых функций, и отредактируем запрос в базу данных
  • cat.php. Аналогично с предыдущем пунктом
  • index.php. Необходимо вклеить код который позволит определить переменную содержащею номер страницы. Данная переменная будет называться pn
  • getchpu.php. Панель навигации должна иметь ЧПУ и динамические ссылки, поэтому необходимо будет создать условие понимание присланных данных в режиме включенного чпу.
  • .htaccess. Для того чтобы движок понимал ссылки навигации, необходимо написать новое условие в данном файле
  • style.css. Необходимо будет создать пару классов для оформление панели. Данные классы будут системными. В общем то эти классы будут единственным воздействие на дизайн панели.

Я пока не знаю, уложусь ли я в один пост, или нет. Но тем не менее сильно не заморачивайтесь если не понимаете суть и назначение некоторых добавлений, увидите в коде все поймете Улыбаюсь

 

Модуль навигации - navig.php

 

Как уже говорил, модуль содержит три функции. Я даю Вам полный код данного модуля. Файл я назвал navig.php и поместил в пользовательскую папку moduls (учтите, код очень большой, поэтому лучше скопируйте его или скачайте исходник. В программе с адекватной подсветкой проще будет разобраться)

<?
function navig($post,$pn,$cat,$page,$chpu)//функция деления заметок на страницы.
{
//$post - количество выводимых постов
//$pn - номер открытой страницы
//$cat - либо id категории либо пустота
//$page - либо index либо cat, в зависимости от того в каком модуле запускается данная функция
//$chpu - режим чпу. 0 - выключен; 1 включен
//Навигация (расчет количества страниц)
//Выводим кол-во записей. Выбор таблицы из которой выводится информация зависит от переменной page.
if($page == "cat")$sql = "SELECT COUNT(*) FROM blog WHERE cat='$cat' AND viewindex='1'";
if($page == "index")$sql = "SELECT COUNT(*) FROM blog WHERE viewindex='1'";

$result3 = mysql_query ($sql);
$myrow3 = mysql_fetch_array ($result3);

$full = $myrow3[0];//заносим в переменную кол-во постов в базе данных
$links = (($full - 1) / $post) + 1;//рассчитываем сколько всего должно быть страниц ([1][2][3][4][5][6])
$links = intval($links);//делаем из переменной целое число (если в результате расчета получилось 6.789, то после операции получим 6)
$page_link = $pn * $post - $post;//рассчитываем с какой строчки sql запрос начнет выводить заметки из базы данных
//Навигация (расчет количества страниц)
$limit[0] = $page_link;//позиция означающая с какой строчки sql запрос начнет выводить заметки из базы данных
$limit[1] = $post;//количество выводимых заметок
$limit[2] = $links;//количество страниц ([1][2][3][4][5][6])
return $limit;//выводим результат в виде массива из трех элементов
}

function listnav($links,$pn,$max,$cat,$page,$chpu)//функция генерации навигационной панели
{
//$links - количество страниц ([1][2][3][4][5][6])
//$pn - номер открытой страницы
//$max - максимальное кол-во АКТИВНЫХ кнопок в центре (между "..." и "...") панели навигации (...[4][5][6] 7 [8][9][10]...)
//$cat - либо id категории либо пустота
//$page - либо index либо cat, в зависимости от того в каком модуле запускается данная функция
//$chpu - режим чпу. 0 - выключен; 1 включен
if($chpu == 1 AND $cat != "")//если ЧПУ выключен и функция запущена из модуля категории.
{
//то выводим имя чпу из таблицы menu
$result3 = mysql_query ("SELECT nameurl FROM menu WHERE id='$cat'");
$myrow3 = mysql_fetch_array ($result3);
}
//
//блок кода формирование центральной части панели
//
$max_pn = $max;//максимальное число АКТИВНЫХ кнопочек на странице (...[4][5][6] 7 [8][9][10]...)
$left_right_links = $max_pn/2;//рассчитываем сколько АКТИВНЫХ кнопок должно быть с левой стороны центральной панели, и с правой стороны
//По умолчанию выводится 6 активных кнопок. При деление на два мы получаем
//[4][5][6] - три активной кнопки с левой стороны центральной панели
//[8][9][10] - и три кнопки с правой стороны центральной панели
//в центре будет не активная кнопка, то бишь открытая страница

for($i=$pn-$left_right_links;$i<$pn;$i++)//формируем левую сторону центральной панели.
//Отсчитываем от открытой страницы максимальное количество
//активных кнопок с лева (по умолчанию 3 кнопки)
{
if($i>=1)//если переменная i больше или равно 1. У нас же нет страницы [-2] =)
{
if($page == "cat")//если функция запущена из модуля категории
{
if($chpu == 0)$forFUN = $cat;//в случае если чпу выключен, определяем id категории
if($chpu == 1)$forFUN = $myrow3['nameurl'];//в случае если чпу включен, определяем имя чпу категории

$nav .= linkBLOCK($page,$chpu,$i,$forFUN,0);//запускаем функцию формирования блока панели навигации
}
if($page == "index")$nav .= linkBLOCK($page,$chpu,$i,'',0);//если функция запущена из модуля новости,
//просто запускаем функцию формирования блока панели.
}
}
//в случае если у нас всего 26 страниц. Активных кнопок в центральной панели должно быть 6, а открыта 10-ая страница
//то на выходи в переменной nav будет
//находится следующее значение (приблизительная схема без оформления html кодом):
//[7][8][9]

$nav .= linkBLOCK('','',$pn,'',1);//прикручиваем не активную кнопку, то бишь открытая страниц
//сейчас в переменной nav находится вот такое значение: [7][8][9] 10

for($i=$pn+1;$i<($pn+1)+$left_right_links;$i++)//формируем правую сторону центральной панели.
//Отсчитываем от открытой страницы максимальное количество
//активных кнопок с права (по умолчанию 3 кнопки)
{
if($i<=$links)//если переменная i не превысило максимальное количество страниц
{
if($page == "cat")//если функция запущена из модуля категории
{
if($chpu == 0)$forFUN = $cat;//в случае если чпу выключен, определяем id категории
if($chpu == 1)$forFUN = $myrow3['nameurl'];//в случае если чпу включен, определяем имя чпу категории

$nav .= linkBLOCK($page,$chpu,$i,$forFUN,0);//запускаем функцию формирования блока панели навигации
}
if($page == "index")$nav .= linkBLOCK($page,$chpu,$i,'',0);//если функция запущена из модуля новости,
//просто запускаем функцию формирования блока панели.
}
}
//сейчас в переменной nav находится следующее значение: [7][8][9] 10 [11][12][13]
//
//блок кода формирование центральной части панели
//

//
//блок кода который поределит нужно ли подключать левую и правую часть панели
//
$minLINKS = $pn - $left_right_links;//определяем номер первой страницы в левой части центрального блока
//Например в нашем случае переменная будет содержать число 7
// <----------
//["7"][8][9] 10 [11][12][13]
$maxLINKS = $pn + $left_right_links;//проделываем ту же операцию, но только в правую сторону
// ------------>
//[7][8][9] 10 [11][12]["13"]

if($minLINKS > 1)//если значение первой страницы левой части центральной панели больше единицы
//в нашем случае переменная имеет значение 7
{
if($minLINKS == 2)$stepFUN = 0;//если значение первой страницы левой части центральной панели равно двум
//то запустим функцию формирования блока в режиме ноль
else $stepFUN = 3;//если значение не равно двум, то запускаем в режиме три

if($page == "cat")//если функция запущена из модуля категории
{
if($chpu == 0)$forFUN = $cat;//записываем id категории в случае если чпу выкл
if($chpu == 1)$forFUN = $myrow3['nameurl'];//заносим имя чпу если чпу включен

$nav = linkBLOCK($page,$chpu,1,$forFUN,$stepFUN).$nav;//формируем блок
}
if($page == "index")$nav = linkBLOCK($page,$chpu,1,'',$stepFUN).$nav;//если функция запущена из модуля новости,
//просто запускаем функцию формирования блока панели.
}
//на выходе переменная nav будет содержать следующее значение: [1]...[7][8][9] 10 [11][12][13]

if($maxLINKS < $links)//если значение последней страницы правой части центральной панели не больше максимального кол-ва страниц
//в нашем случае страниц 26 а последняя страница правой части - 13.
{
if($links-1 == $maxLINKS)$stepFUN = 0;//если значение последней страницы правой части центральной панели
//равно предпоследнему значению общего кол-ва страниц (в нашем примере 25-ти)
//то функция будет запущена в режиме ноль
else $stepFUN = 2;//в противном случае в режиме два

if($page == "cat")//если функция запущена из модуля категории
{
if($chpu == 0)$forFUN = $cat;//записываем id категории в случае если чпу выкл
if($chpu == 1)$forFUN = $myrow3['nameurl'];//заносим имя чпу если чпу включен

$nav .= linkBLOCK($page,$chpu,$links,$forFUN,$stepFUN);//формируем блок
}
if($page == "index")$nav .= linkBLOCK($page,$chpu,$links,'',$stepFUN);//если функция запущена из модуля новости,
//просто запускаем функцию формирования блока панели.
}
//сейчас в переменной nav содержится следующее значение: [1]...[7][8][9] 10 [11][12][13]...[26]
//
//блок кода который определит нужно ли подключать левую и правую часть панели
//


$nav = "<div id=\"navig\" align=\"center\">".$nav."</div>";//заносим с генерированное значение в блок div
return $nav;//выводим результат в виде html кода
}
//-------------------------------------
function linkBLOCK($page,$chpu,$pn,$cat,$step)//функция формирования блока
{
//$page - либо index либо cat, в зависимости от того в каком модуле запускается данная функция
//$chpu - режим чпу. 0 - выключен; 1 включен
//$pn - номер открытой страницы
//$cat - либо id категории либо пустота
//$step - режим запуска функции:
//0 - обычное формирование ссылки с адресом страницы и номером страницы
//1 - формирования блока с номером открытой страницы. НЕ является ссылкой
//2 - формирования ссылки с адресом страницы и номером страницы
//плюс прибавка в полученному результату многоточие (...[число])
//3 - формирования ссылки с адресом страницы и номером страницы
//плюс прибавка в полученному результату многоточие ([число]...)
if($step == 0 OR $step == 2 OR $step == 3)//если запущены режимы 0 или 2 или 3
{
if($chpu == 0)//если чпу выключен
{
if($page == "cat")$link = "index.php?cat=".$cat."&pn=".$pn;//формирование ссылки для категории
if($page == "index")$link = "index.php?pn=".$pn;//формирование ссылки для модуля news
}
if($chpu == 1)//если включен чпу
{
if($page == "cat")$link = "category/".$cat."/".$pn."/";//формирование чпу для категории
if($page == "index")$link = $pn."/";//формирование чпу для модуля news
}

$result = "<div class='navig'><a href='".$link."'>".$pn."</a></div>";//обвертываем значение html кодом

if($step == 2)$result = "<div class='morenavig'>...</div>".$result;//если режим запуска 2, то прибавляем многоточее после ссылки
if($step == 3)$result .= "<div class='morenavig'>...</div>";//если режим запуска 3, то прибавляем многоточее перед ссылкой
}
if($step == 1)$result = "<div class='navigACTIV'>".$pn."</div>";//если режим запуска 1 то просто обвертываем номер страницы html кодом

return $result;//выводим результат в виде html кода
}
?>

Я потратил несколько часов что бы за комментировать данный код. Логика всех функций должна быть ясна. (надеюсь это так Краснею) Я даже не знаю чего бы добавить Смеюсь вроде все подробно расписал в коде... В общем если есть какие либо вопросы, то напишите мне на мыло или в комментарии, я поясню непонятные Вам моменты..

 

Подключаем модуль на главной странице и странице категории

 

Как уже писал выше, в данных модулях на нужно будет рассчитать позицию с которой будут выводится 10 наших заметок. Так же необходимо будет подключить панель навигации. Для расчета позиции у нас есть функция  navig(), а для вывода панели у нас есть функция listnav(), вот и воспользуемся ими Улыбаюсь

 

Подключаем модуль на главной странице

 

Открываем news.php, и правим функцию index_page() вот таким образом:

function index_page($chpu)
{
global $pn;

include("moduls/navig.php");
$limit = navig(10,$pn,"","index",$chpu);
$links = $limit[2];

$result_index = mysql_query("SELECT * FROM blog WHERE viewindex='1' ORDER BY id DESC LIMIT $limit[0], $limit[1]");//Выводим из базы данных последние 10 записей
$myrow_index = mysql_fetch_array($result_index);
if($myrow_index != "")//Проверяем есть ли в базе данных записи
{//Если есть...
$sm_read = file("templates/news.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его
do//Цикл do while
{
$edd_tamp = $sm_read;//Так как на придется править шаблон,
//то лучше его сохранить в отдельную переменную, иначе нам придется
//пользоваться функцией file() чаще чем 1 раз, а это нагрузка на сервер
$text = explode("<p>[end]</p>",$myrow_index[text]);//идентификатор в тексте показывающий,
//что после него следует вывести кнопку "читать дальше"

//формируем ссылку на пост
if($chpu == 0)$link = "index.php?blog=".$myrow_index[id];
else $link = "post/".$myrow_index[nameurl];

//Замены идентификаторов на переменные из базы данных
$edd_tamp = str_replace("[_text]",$text[0],$edd_tamp);//Текст
$edd_tamp = str_replace("[_title]",$myrow_index[title],$edd_tamp);//Название статьи
$edd_tamp = str_replace("[_author]",$myrow_index[author],$edd_tamp);//Автор статьи
$edd_tamp = str_replace("[_date_b]",$myrow_index[date_b],$edd_tamp);//Дата размещения
$edd_tamp = str_replace("[_gomore]",$link,$edd_tamp);//линк статьи

$news .= $edd_tamp;// Склеиваем весь с генерированный код в одну переменную
}
while($myrow_index = mysql_fetch_array($result_index));

if($links > 1)$news .= listnav($links,$pn,6,"","index",$chpu);//Вывод ссылок на страницы
}
else $news = "<p align='center'>Нет записей в базе данных</p>";//Если записей нет, то вывести это сообщение
return $news;//Выводим с генерированный html код
}

Прежде чем делать какие либо расчеты мы объявляем переменную pn (которую создадим ниже) глобальной

global $pn;

После подключаем наш новый модуль и запускаем функцию navig()

include("moduls/navig.php");
$limit = navig(10,$pn,"","index",$chpu);
$links = $limit[2];

Функция navig() возвращает массив из трех элементов. В первых двух элементах находится номер позиции и количество выводимых постов. В третьем элементе находится общее количество страниц.

Теперь имея позицию и количество выводимых постов мы может создать новый запрос

$result_index = mysql_query("SELECT * FROM blog WHERE viewindex='1' ORDER BY id DESC LIMIT $limit[0], $limit[1]");//Выводим из базы данных последние 10 записей

Далее идет не тронутая логика модуля. После формирование html кода с анонсами скрипт попытается подключить панель

if($links > 1)$news .= listnav($links,$pn,6,"","index",$chpu);//Вывод ссылок на страницы

Панель появится на экране только в том случае если страниц больше одной

 

Подключаем модуль на страницах категории

 

Открываем файл cat.php и правим функцию index_cat() вот таким образом:

function index_cat($cat,$chpu)
{
global $pn;

include("moduls/navig.php");
$limit = navig(10,$pn,$cat,"cat",$chpu);
$links = $limit[2];

$result_index = mysql_query("SELECT * FROM blog WHERE cat='$cat' AND viewindex='1' ORDER BY id DESC LIMIT $limit[0], $limit[1]");//Выводим из базы данных 10 записей где колонка cat равна переменной $cat
$myrow_index = mysql_fetch_array($result_index);
if($myrow_index != "")//Проверяем есть ли в базе данных записи
{//Если есть...
$sm_read = file("templates/news.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его
do//Цикл do while
{
$edd_tamp = $sm_read;//Так как на придется править шаблон,
//то лучше его сохранить в отдельную переменную, иначе нам придется
//пользоваться функцией file() чаще чем 1 раз, а это нагрузка на сервер
$text = explode("<p>[end]</p>",$myrow_index[text]);//идентификатор в тексте показывающий,
//что после него следует вывести кнопку "читать дальше"

//формируем ссылку на пост
if($chpu == 0)$link = "index.php?blog=".$myrow_index[id];
else $link = "post/".$myrow_index[nameurl];

//Замены идентификаторов на переменные из базы данных
$edd_tamp = str_replace("[_text]",$text[0],$edd_tamp);//Текст
$edd_tamp = str_replace("[_title]",$myrow_index[title],$edd_tamp);//Название статьи
$edd_tamp = str_replace("[_author]",$myrow_index[author],$edd_tamp);//Автор статьи
$edd_tamp = str_replace("[_date_b]",$myrow_index[date_b],$edd_tamp);//Дата размещения
$edd_tamp = str_replace("[_gomore]",$link,$edd_tamp);//линк статьи

$result .= $edd_tamp;// Склеиваем весь с генерированный код в одну переменную
}
while($myrow_index = mysql_fetch_array($result_index));

if($links > 1)$result .= listnav($links,$pn,6,$cat,"cat",$chpu);//Вывод ссылок на страницы
}
else $result = "<p align='center'>Нет записей в базе данных</p>";//Если записей нет, то вывести это сообщение
return $result;//Выводим с генерированный html код
}

Я проделал тут тоже самое что и в модуле мини новостей. Про параметры функций navig() и listnav() читайте в комментариях модуля navig.php, там все подробно расписано Улыбаюсь

 

Объявляем переменную pn

 

Ну что же, подключение прошло успешно, теперь необходимо определить, очень важную для нашего нового модуля, переменную pn!

Открываем файл пользовательский index.php и добавляем сразу после вот этого блока:

//GET ПЕРЕМЕННАЯ cat
if(isset($_GET['cat']))
{
$cat = $_GET['cat'];
if(!preg_match("/^[0-9]+$/",$cat))
{
header("location: index.php");
exit;
}
}
//GET ПЕРЕМЕННАЯ cat

 Вот такой код:

//GET ПЕРЕМЕННАЯ pn
if(isset($_GET['pn']))
{
$pn = $_GET['pn'];
if(!preg_match("/^[0-9]+$/",$pn))
{
header("location: index.php");
exit;
}
}

if(!isset($pn))$pn = 1;
//GET ПЕРЕМЕННАЯ pn

Этот небольшой скрипт проверит на корректность присланную переменную и сохранит ее значение в переменной pn. Если же присланного значение не существует, то переменная pn все равно объявится, но со значением по умолчанию, а именно с единицей Улыбаюсь

 

Объявляем переменную pn в случае если включен режим ЧПУ

 

В режиме отключенного ЧПУ ссылки будут выглядеть приблизительно вот так:

http://rio-shaman.ru/index.php?pn=4

В случае же включенного ЧПУ ссылки должны выглядеть вот так:

http://rio-shaman.ru/4/

В случае если пользователь обращается к ссылке ЧПУ вида, то скрипт создаст не переменную $_GET['pn'] а переменную $_GET['pagesite']. Именно поэтому у нас существует файл getchpu.php в котором мы принимаем подобные значения и переводим их в понятные для нашего движка переменные. Поэтому открываем наш файл getchpu.php и добавляем сразу после:

//GET ПЕРЕМЕННАЯ category
if(isset($_GET['category']))
{
if(!preg_match("/^[-a-z0-9]+\.html$/",$_GET['category']))//если имя не корректное,то переносим
{
header("location: ".$server_root);//на главную страницу
exit;
}
$cat = chpu($_GET['category'],"category");//по имени страницы достаем из бд id
if($cat == "")//если результат функции пустота, то переносим пользователя
{
header("location: ".$server_root);//на главную страницу
exit;
}
}
//GET ПЕРЕМЕННАЯ category

Вот такой блок кода

//GET ПЕРЕМЕННАЯ pagesite
if(isset($_GET['pagesite']))
{
if(!preg_match("/^[0-9]+$/",$_GET['pagesite']))//если имя не корректное,то переносим
{
header("location: ".$server_root."404.html");//на страницу с ошибкой
exit;
}
$pn = $_GET['pagesite'];
}
//GET ПЕРЕМЕННАЯ pagesite

Надеюсь все понятно... Правда у Вас может возникнуть вопрос, с чего это блог решит создавать переменную $_GET['pagesite'] а не $_GET['pn']? Вопрос вполне уместный, ведь блог пока не может создать переменную $_GET['pagesite'], данную возможность мы реализуем в следующем пункте Улыбаюсь

 

Создание переменной $_GET['pagesite'] с помощью .htaccess

 

Как известно в режиме включенного ЧПУ за объявление переменных отвечает файл .htaccess. Вот и в данном случаем нам необходимо будет прибегнуть к силе данного файла. Открываем его и правим код в нем вот таким образом:

RewriteEngine on
RewriteRule ^([0-9]+)/$ index.php?pagesite=$1 [L]
RewriteRule ^post/([-a-z0-9]+.html)$ index.php?post=$1 [L]
RewriteRule ^category/([-a-z0-9]+.html)$ index.php?category=$1 [L]
RewriteRule ^category/([-a-z0-9]+.html)/([0-9]+)/$ index.php?category=$1&pagesite=$2 [L]
RewriteRule ^contacts.html$ index.php?contact=1 [L]

Как видите, я добавил два новых условия:

RewriteRule ^([0-9]+)/$ index.php?pagesite=$1 [L]

и

RewriteRule ^category/([-a-z0-9]+.html)/([0-9]+)/$ index.php?category=$1&pagesite=$2 [L]

Если пользователь обратится к адресу:

http://rio-shaman.ru/4/

то движок создаст вот такую ссылку для обработки:

http://rio-shaman/index.php?pagesite=4

Ну а если же пользователь обратится вот по такому адресу:

http://rio-shaman.ru/category/testovaya-kategoriya.html/2/

То скрипт получит вот такую ссылку:

http://rio-shaman.ru/index.php?category=category/testovaya-kategoriya.html&pagesite=2

После вот таких преобразований, в getchpu.php переменная $_GET['pagesite'] преобразуется в переменную pn и все будет пучком Смеюсь

 

Новые стили для панели навигации

 

В общем то последнее что нам осталось сделать, так это оформить нашу панель. Открываем style.css и в самый низ прописываем вот такие стили:

.morenavig
{
padding:5px;
float:left;
margin:2px;
}
.navig,.navigACTIV
{
padding:5px;
float:left;
margin:2px;
}
.navigACTIV
{
border:1px solid #dcdcdc;
}
  • morenavig - стиль оформления блока содержащего многоточие
  • navig - блоки с ссылками
  • navigACTIV - блок для кнопки открытой страницы

 

Заключение

 

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

 

как выглядит панель

 

Я вывел по три поста на странице, уж очень было лень добавлять несколько десятков пустых страниц Улыбаюсь

Если у Вас есть какие либо вопросы, то пользуйтесь формой ниже. Если Вы еще не подписаны на мой блог, то обязательно подпишитесь на RSS ленту блога через ридер, или же по почте. Улыбаюсь

Всего Вам наилучшего! У меня все!

Исходник
 

Возможно Вам будут интересны следующие заметки

Комментарии (48)

Ваше имя *
Сайт
Ваш E-mail *
Ваше сообщение *
 
NiunCMS, 08 Декабря 2012 г. 17:36 пишет:
Гость
Не работает :(
Rio-Shaman, 08 Декабря 2012 г. 17:55 пишет:
Автор
Можно подробнее =)
Ответ для пользователя: NiunCMS
NiunCMS, 08 Декабря 2012 г. 18:42 пишет:
Гость
неотображает данную навигацию, что только не перепробовал( даже пробовал подключать в index.php методом:
include("module_ncms/navig.php");
$txt= pn();
отображает только ошибки что navig.php не работает
если есть время посмотрите плиз:
http://niun.ru/downoload
Ответ для пользователя: Rio-Shaman
Rio-Shaman, 09 Декабря 2012 г. 11:42 пишет:
Автор
Вы у SQL запроса (в файле news.php) заменяли "LIMIT 100" на "LIMIT $limit[0], $limit[1]" ?
Ответ для пользователя: NiunCMS
NiunCMS, 10 Декабря 2012 г. 00:06 пишет:
Гость
Да, но серовно
Ответ для пользователя: Rio-Shaman
NiunCMS, 09 Января 2013 г. 23:14 пишет:
Гость
Ну, так что не поможете? прошу пожалуйста,
скачайте: http://niun.ru/niuncms_1.4.2.zip
и посмотрите что, там неверно :(
Rio-Shaman, 10 Января 2013 г. 19:55 пишет:
Автор
Я скачал копию Вашего движка, внес исправление в некоторые файлы, вот архив с этими файлами:
http://rio-shaman.ru/download/download_2001023246.rar
Я прокомментировал все что исправил. Надеюсь это Вам поможет
Ответ для пользователя: NiunCMS
NiunCMS, 10 Января 2013 г. 21:50 пишет:
Гость
Спасибо!) а работать будет? вы тестировали?
Ответ для пользователя: Rio-Shaman
Rio-Shaman, 10 Января 2013 г. 22:01 пишет:
Автор
У меня работает... я сделал навигацию только для главной страницы
Ответ для пользователя: NiunCMS
NiunCMS, 10 Января 2013 г. 22:17 пишет:
Гость
Ну посмотрим))) а у вас есть идеи о написание модуля Пользователей? думаю необходимый мод)
Ответ для пользователя: Rio-Shaman
Rio-Shaman, 10 Января 2013 г. 23:41 пишет:
Автор
Я полностью переписываю движок. Данная реализация конечная, если у кого есть желание, никто никого не сдерживает =) Цель была: написать рабочий проект и описать его, что я собственно и сделал...
Ответ для пользователя: NiunCMS
NiunCMS, 10 Января 2013 г. 23:49 пишет:
Гость
Спасибо за ответ, и еще вопрос... будет ли написано в блоге о том что будет модуль пользователи? + нужно будет переписывать полностью админку, как так там по id нужно пускать людей
например:
Читатель: id 3
Модератор: id 2
Администратор: id 1
Ответ для пользователя: Rio-Shaman
Rio-Shaman, 11 Января 2013 г. 00:56 пишет:
Автор
Я не буду подробно описывать работу новой системы. Только в общих чертах. Может быть опубликую пару заметок касающихся авторизации "персонала" сайта.
У системы RS-BLOG не предусмотрена регистрация и хранение других аккаунтов в базе данных, так как система является персональным блогом, а не коллективным.

P.S.: Если собираетесь реализовывать коллективный доступ в админ панель, то не вздумайте завязывать работу на id. Вам потребуется создать отдельное поле (например access) и вписывать туда число, которое будет олицетворять уровень доступа:
3 - Гость
2 - Читатель
1 - Модератор
0 - Админ
Выводится уровень доступа (а именно строка в БД) по сочетанию логина и пароля пользователя.
Ответ для пользователя: NiunCMS
ислям, 10 Апреля 2013 г. 20:00 пишет:
Гость
извините за нескромный вопрос, откуда появилась таблица page ??? и для чего она нужна??
ислям, 10 Апреля 2013 г. 21:50 пишет:
Гость
Хочу написать обычную постраничную навигацию
ислям, 10 Апреля 2013 г. 22:05 пишет:
Гость
вот еще вопрос, в файле navig.php идет выборка из базы сторки " cat "
if($page == "cat")$sql = "SELECT COUNT(*) FROM blog WHERE cat='$cat' AND viewindex='1'";
откуда она появилась и можно ли вместо ее использовать id записи???
Алексей, 10 Апреля 2013 г. 23:22 пишет:
Автор
Я не понимаю о какой таблице идет речь
Ответ для пользователя: ислям
Алексей, 10 Апреля 2013 г. 23:26 пишет:
Автор
Что значит от куда она появилась? Данная выборка предназначена для определения количества строк в таблице blog, чей столбец cat равен какому то числу.
Количество строк необходимо для того что бы определить сколько должно быть страниц.
Ответ для пользователя: ислям
ислям, 10 Апреля 2013 г. 23:58 пишет:
Гость
в нашу таблицу нужно добавить поле cat ?
Ответ для пользователя: Алексей
ислям, 11 Апреля 2013 г. 00:02 пишет:
Гость
я просто только недавно начал изучать php решил написать навигацию для мини новостей, и наткнулся на вашу статью, мне она понравилась, но повторить результат не получается...
Rio-Shaman, 11 Апреля 2013 г. 00:08 пишет:
Автор
Связывание таблицы с заметками (blog) с пунктами меню (как раз колонка cat) производилась вот в этой статье:
http://rio-shaman.ru/razrabotka-cms/razrabotka-bloga/menju-i-mini-novosti/
Боюсь что Вам скорее всего нужно будет проходить весь цикл статей "создать блог с нуля". Сложно вообразить какие у Вас еще могут возникнуть трудности в написание навигации.
Ответ для пользователя: ислям
ислям, 11 Апреля 2013 г. 18:19 пишет:
Гость
а как реализовать обычную постраничную навигацию без всего этого, просто по 10 записей на страницу???
Алексей, 11 Апреля 2013 г. 22:48 пишет:
Автор
Я скдепал простой пример постраничной навигации. Вот ссылка на скачку:
http://rio-shaman.ru/content/files/navigation.rar
Я очень упростил его. Замените название полей и таблиц. Ну еще естественно коннект к БД. Надеюсь разберетесь что к чему.
Ответ для пользователя: ислям
ислям, 12 Апреля 2013 г. 15:15 пишет:
Гость
а как сделать , чтоб при заголовки статей были ссылками, и при нажатии на них выводилась эта статья?
у меня никак не получается, уже все перепробовал, ничего не получается......помогите
Ответ для пользователя: Алексей
ислям, 12 Апреля 2013 г. 15:16 пишет:
Гость
это получается их нужно разбить на два файла php?
Алексей, 12 Апреля 2013 г. 16:29 пишет:
Автор
Вы сейчас про детализацию статьи говорите?
Ответ для пользователя: ислям
ислям, 13 Апреля 2013 г. 12:46 пишет:
Гость
да, как совместить эти две функции?
Алексей, 15 Апреля 2013 г. 14:58 пишет:
Автор
У ваших статей должно быть поле в БД с уникальным ключом (его обычно 'id' называют). Статьи с навигацией выводите тогда когда переменная с id не известна. А если известно то делайте выборку из БД по id. Таким образом вытащите детализацию.
Ответ для пользователя: ислям
ислям, 16 Апреля 2013 г. 20:44 пишет:
Гость
а вот как работает таблица pages?
ислям, 17 Апреля 2013 г. 14:33 пишет:
Гость
http://webfile.ru/6482587
можешь посмотреть, почему не работает?
Алексей, 17 Апреля 2013 г. 14:54 пишет:
Автор
В вашем sql файле нашел таблицу page. Теперь понял про какую именно таблицу Вы меня спрашивали =). Данная таблица хранит в себе главные значения тега <meta> и <title>. То есть заголовок, описание страницы, ключевые слова.

Что касается Вашей проблемы вывести детализацию и анонсы статей. Попробуйте у текста отмерить абзац и вставить тег [end]. Данный тег делит Вашу статью на анонс и продолжение.

пример:

Эти модели, разработанные с использованием
[end]
лидирующих в отрасли технологий обработки изображений Canon....
Ответ для пользователя: ислям
ислям, 17 Апреля 2013 г. 15:15 пишет:
Гость
он пишет что нет записей в базе данных.....
Алексей, 17 Апреля 2013 г. 15:41 пишет:
Автор
В Вашей таблице blog, у всех строчек, колонка viewindex равна нулю. А при выборке идет условие:

WHERE viewindex='1'

Вот, вполне возможно, из-за этого у Вас и нет записей.
Ответ для пользователя: ислям
ислям, 17 Апреля 2013 г. 15:51 пишет:
Гость
нужно просто ко всем записям добавть 1?
Алексей, 17 Апреля 2013 г. 15:55 пишет:
Автор
Ну для начало можно убрать из запроса условие viewindex='1'. Или же заменить в условие 1 на ноль. Таким образом Вы проверите в этом ли проблема =)
Ответ для пользователя: ислям
Богдан, 26 Сентября 2013 г. 20:38 пишет:
Гость
Вечер добрый, Алексей) В написании своего движка столкнулся с задачей удаления устаревших записей из таблицы. Смысл таков: на страницу выводятся последнии 10 новостей, как сделать так чтобы все записи старше етих 10 последних автоматически удалялись? Скажем у меня в базе есть 10 записей, я добавляю новую, нажимаю "сохранить", запись добавилась, а запись которая была, допустим, из 10 id первой( с индексом 0 )- удалилась. и теперь у меня новости выводятся с id 1 до id 11. Как можно реализовать данный запрос?
Алексей, 30 Сентября 2013 г. 10:36 пишет:
Автор
Так просто выберите самую первую запись, и удалите ее.
	$sql = "SELECT id FROM table LIMIT 1 OFFSET 0;";
	
	$result_index = mysql_query($sql);
	$myrow_index = mysql_fetch_assoc($result_index);
		
	if ($myrow_index != FALSE)
		mysql_query("DELETE FROM table WHERE id='".$myrow_index['id']."'");
Ответ для пользователя: Богдан
Влад, 17 Июня 2014 г. 05:15 пишет:
Читатель
Алексей, столкнулся я с проблемой, которую никак не получается решить.
Суть в том, что данный модуль не "видит" GET переменную page. Из-за этого, запрос на получение количества страниц пуст (Query was empty) и сам блок навигации не выводиться (т.к. не срабатывают if условия).
Быть может, Вы сможете подсказать, где искать ошибку?
Алексей, 19 Июня 2014 г. 08:32 пишет:
Автор
Несовсем онятно. В коде нет переменой гет с ключем page. Есть гет с ключем pn
Ответ для пользователя: Влад
Влад, 19 Июня 2014 г. 08:47 пишет:
Читатель
Видимо, не совсем правильно выразился.
У нас есть переменная page, с помощью которой мы определяем, запрос к какой таблице БД будем делать.
Конкретно эти строчки кода:
if($page == "cat")$sql = "SELECT COUNT(*) FROM blog WHERE cat='$cat' AND viewindex='1'";
if($page == "index")$sql = "SELECT COUNT(*) FROM blog WHERE viewindex='1'";
Так вот у меня она почему то пустая (переменная).
Ответ для пользователя: Алексей
Алексей, 27 Июня 2014 г. 08:24 пишет:
Автор
Она не может быть пустой так как мы передаем ее значение в явном виде. Смотрите код функции index_page()
Ответ для пользователя: Влад
Иван Драга, 23 Октября 2014 г. 17:57 пишет:
Гость
Наверно единственный более менее вменяемый Мануал в РуНете, о том как сделать ЧПУ в постраничной навигации.) Спасибо вам !

Кстати, если страницы не существует лучше не перекидывать пользователя на главную, а выдавать 404 ошибку.
С точки зрения SEO это будет правильнее !!
Иван Драга, 25 Октября 2014 г. 11:39 пишет:
Гость
Да и еще в htaccess можно добавить вот такие строчки:
RewriteCond %{REQUEST_URI} ^(.*)//(.*)$
RewriteRule . %1/%2 [R=301,L]
т.к. если добавить дополнительные слэши между uri
будет дубль страница, опять же для SEO не хорошо
Пример: razrabotka-cms/uluchshenija//////////postranichnaja-navigacija//
Павел, 04 Июня 2017 г. 09:12 пишет:
Гость
Добрый день. Вопрос, постраничная навигация без чпу работает? Просто не могу настроить. Через модуль news все работает, а через модуль cat не хочет.... пишет - Fatal error: Cannot redeclare navig() (previously declared in F:\OpenServer\domains\localhost\moduls\navig.php:2) in F:\OpenServer\domains\localhost\moduls\navig.php on line 25
Алексей, 04 Июня 2017 г. 09:27 пишет:
Автор
Доброго времени суток. Судя по ошибке у Вас подключается две функции с одинаковым именем navig()
Ответ для пользователя: Павел
Павел, 04 Июня 2017 г. 15:55 пишет:
Гость
Да, спасибо. Я разобрался в cat.php убрал include(moduls/navig.php). Большое спасибо.
Ответ для пользователя: Алексей
Павел, 04 Июня 2017 г. 15:57 пишет:
Гость
Скажи пожалуйста, можно ли скачать полностью движку?
Ответ для пользователя: Павел
Алексей, 06 Июня 2017 г. 10:12 пишет:
Автор
Да, вот по этой ссылке
Ответ для пользователя: Павел