Доброго времени суток дорогой читатель! Добро пожаловать на мой блог! Сегодня мы продолжим работу над циклом "Создать блог с нуля". Нам предстоит задать фундамент модуля ЧПУ, если быть точнее то нам понадобится php функция, которая по имени страницы определит нам id в таблице базе данных. Но прежде чем мы приступим к написанию функции нам необходимо будет создать и настроить файл htaccess. А так же отредактировать нашу таблицу в базе данных, создать новую колонку, в которой мы будем хранить имена страниц.
На файл htaccess мы сильно отвлекаться не будем, его работа не так уж и сложна, тем более если Вы знакомы с регулярными выражениями в php. Вот, что касается самого модуля ЧПУ, то он представлен в виде двух файлов ( ну можно и в один, но у меня почему то получилось два =) ) и "сети условий" по всему движку. Не пугайтесь, под термином "сети условий", я подразумеваю тот геморрой с автоматической смены ссылок по всему движку! Сегодня мы займемся лишь фундаментом, и добьемся того что бы пост, на странице нашего блога, был доступен по адресу с человеко-понятной ссылкой
Цели я указал в анонсе, так что сейчас пару слов для новоприбывших, и приступим =)
Если Вы на блоге в первый раз, то эта маленькая заметка именно для Вас! Пускай тема ЧПУ обширная и применима к любому проекту, Вам, именно в материале на этой странице, будет очень сложно выявить что-то полезное для себя, по причине того, что этот пост, как и большинство на моем блоге, является частью цикла статей "Создать блог с нуля". Цикл ориентирован на аудиторию которая хочет на практике научится программировать на php. Если Вы из таких, то добро пожаловать! Переходите по ссылке, что я дал Вам выше и приступайте к изучению изложенного мной материала
Если Вы собираетесь задержаться на моем блоге, то подпишитесь на RSS ленту блога через ридер, или же по почте
Так как у нас пока нет модуля который автоматически, из заголовков, делал бы нам имена ссылок, то придется не только создать колонку но и заполнить ее каким-нить именем. Только учтите, что имя должно состоять из маленьких букв английского алфавита, плюс к этому не должно быть пробелов, вместо них ставим тире ( - ). Это условие обязательно, ибо скрипт проверки будет отсеивать не правильные адреса, перекидывая пользователя на главную страницу блога.
Заходим в структуры таблицы blog, и после id создаем новую колонку
Заполняем поля приблизительно вот так ( имя поля nameurl )
Теперь, необходимо заполнить новую колонку. У меня лишь одна запись в базе данных, поэтому для меня заполнение новой колонки не является проблемой =)
В конце имени необходим поставить ".html". Если у Вас в планах не использовать такое окончание у Ваших страниц, то можете не писать, только в этом случае Вам придется немного переделать файл htaccess, а именно убрать расширение там.
Я для тестовой странице использовал вот такое имя: dobro-pozhalovat.html
Ну чтож, с этой задачей мы справились, теперь приступим к самому файл htaccess
Создавать лучше всего с помощью программы Notepad++, ибо в некоторых случаях виндоус ругается, что у файла нет имени, ведь имени и в правду нет =) только расширение .htaccess
На всякий случай я скину Вам файл, вот он. Этот файл необходимо поместить в корень нашего блога
Содержимое файла следующее:
RewriteEngine on
RewriteRule ^post/([-a-z0-9]+.html)$ index.php?post=$1 [L]
RewriteRule ^category/([-a-z0-9]+.html)$ index.php?category=$1 [L]
RewriteRule ^contacts.html$ index.php?contact=1 [L]
Первая строчка включает возможность перенаправления с динамических ссылок на ЧПУ. Вторая отвечает за ссылки на посты. То есть если ссылка будет вот такого вида
http://rsblog.ru/post/dobro-pozhalovat.html
То сервер поймет, что обращение идет к странице с постами, и создаст для себя динамическую ссылку для дальнейшей обработки.
Третья строчка отвечает за ссылки к категориям
http://rsblog.ru/category/testovaya-kategoriya.html
Ну и последняя строчка отвечает за ссылку ведущая на форму обратной связи
http://rsblog.ru/contacts.html
Обратите внимание что регулярное выражение находится в скобках, если Вы знакомы с регулярками, то прекрасно знаете, что скобки это сохранение. Вопрос, куда переносятся сохраненные данные? Ответ: В переменную 1. Да, именно 1 (единица).
Если Вам нужны ЧПУ без .html то редактируйте регулярное выражение в файле htaccess, на такой вид ссылок, который Вам нужен!
Особо останавливаться тут не будем, я многое тут не знаю, поэтому долго разглагольствовать на эту тему не имею право, единственное что бы я еще добавил, это пару слов о флаге [L]. Я может и ошибаюсь, но как я понял этот флаг останавливает проверки, что идут ниже, это что-то типа break (прерывание работы всего цикла) у циклов.
Под итожу то что написано в файле htaccess: Условия, для каждого вида станиц которые есть у нашего движка, а именно
Если Вы знакомы с регулярками, то разобраться в файле Вам не составит труда.
Начнем с создания алгоритма поиска. Для этого нам понадобится знать в какой таблице искать и что искать. У Вас может возникнуть вопрос, что значит в какой таблице? Ведь таблица у нас одна - blog. Это не совсем так, сегодня мы рассматриваем только посты, но так же нам известно, что у категорий тоже есть свои ссылки, а таблица которая будет содержать имена категорий называется menu, именно поэтому алгоритм должен знать в какой таблице ему искать. Пускай функция chpu() на данном этапе будет работать лишь на половину, зато в следующих постах нам не придется редактировать ее (функцию).
Создаем файл chpu.php помещаем его в пользовательские модули нашего движка, и пишем в этом файле следующую функцию:
<?
function chpu($url,$dirDB)//функция ЧПУ
{
//$url - имя с помощью которого мы определим id
//$dirDB - режим, с помощью которого мы определим в какой таблице базы данных нам искать
//определяем запрос в зависимости от того какую страницу открывает пользователь (текст поста или категорию)
if($dirDB == "post")$sql = "SELECT id FROM blog WHERE nameurl = '$url'";//текст поста
if($dirDB == "category")$sql = "SELECT id FROM menu WHERE nameurl = '$url'";//категория
$result_index = mysql_query($sql);//Выводим из базы статью
$myrow_index = mysql_fetch_array($result_index);
if($myrow_index != "") return $myrow_index[id];//если найдена строчка в БД выводим id
else return "";//если нет, выводим пустоту
}
?>
Функция очень простая, так что не будет на ней останавливаться, тем более я уже не раз разъяснял логику поиска id в таблице.
Цель этого скрипта определить в каком режиме запустить функцию chpu(). Определить это можно по GET запросу который создает нам сервер при обращение к станице по ЧПУ. Если Вы внимательно смотрели содержимое файла htaccess, и приблизительно поняли его работу, то Вы должны догадаться, что сервер для себя определяет ссылку вот такого вида
http://rsblog.ru/index.php?post=dobro-pozhalovat.html
То есть, если пользователь обратился к станице с помощью ЧПУ то сервер создаст GET запрос post, создание такого запроса сигнализирует нам о том что пользователь обратился на страницу поста, стало быть функцию chpu() необходимо запускать в режиме поиска id в таблице blog
Создаем файл getchpu.php, сохраняем его в папке пользовательских модулей и пишем в нем следующий скрипт
<?
if($chpu == 1)//если блог работает в режиме вкл ЧПУ
{
include("moduls/chpu.php");
//GET ПЕРЕМЕННАЯ post
if(isset($_GET['post']))
{
if(!preg_match("/^[-a-z0-9]+\.html$/",$_GET['post']))//если имя не корректное,то переносим
{
header("location: ".$server_root);//на главную страницу
exit;
}
$blog = chpu($_GET['post'],"post");//по имени страницы достаем из бд id
if($blog == "")//если результат функции пустота, то переносим пользователя
{
header("location: ".$server_root);//на главную страницу
exit;
}
}
//GET ПЕРЕМЕННАЯ post
//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
}
?>
Логика скрипта следующая:
Если Вы создаете ссылки без .html, то Вам придется переделать регулярное выражение, ибо Ваши ссылки не пройдут проверки!
Тут есть один момент. Если Вы писали движок с самого начала курса, то у Вас скорее всего нет переменной server_root. Если Вы ставили копию движка, что я давал в посте "Установка нашей CMS", то эта переменная у Вас есть.
Если у Вас нет этой переменной, то откройте пользовательский файл index.php, и сразу после подключение к базе данных пропишите эту переменную
//ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ (БД)
$nameDB = "rsblog";//Название БД
$nameSERVER = "localhost";//Сервер
$nameUSER = "root";//Имя пользователя БД
$passUSER = "";//Пароль пользователя БД
mysql_select_db($nameDB, mysql_connect($nameSERVER,$nameUSER,$passUSER));
$server_root = "http://адрес_вашего_блога.ru/";
//ПОДКЛЮЧЕНИЕ К БАЗЕ ДАННЫХ (БД)
Значение переменной является адрес Вашего блога. Эта переменная необходима была в админке для авторизации, тут же она необходима для реализации ЧПУ, в частности для тега <base> что мы применим чуть ниже.
Открываем пользовательский файл index.php, и сразу после подключения к базе данных пишем вот такой код
$chpu = 1;//настройка включение выключение ЧПУ (1 - вкл; 0 - выкл)
//ЧЕЛОВЕКО-ПОНЯТНЫЙ УРЛ
include("moduls/getchpu.php");
//ЧЕЛОВЕКО-ПОНЯТНЫЙ УРЛ
Первая строчка, как Вы поняли, ручное включение режима ЧПУ. Вторая строчка, подключение скрипта позволяющая определить открываемую страницу, в этом же скрипте подключается алгоритм поиска записей.
Теперь в самом низу, перед строчкой
include("templates/index.html");//Подключение шаблона
Создаем переменную urlsite
$urlsite = $server_root;
Эта переменная необходима для того чтобы определить базовую ссылку сайта. В шаблоне index.html после строчки
<meta name="keywords" content="<?=$header_metaK?>">
вставляем вот такой тег
<base href="<?=$urlsite?>">
Этот тег позволяет определить корень сайта, тем самым мы избавимся от глюка который мешает правильно определить пути к стилям. Если не поместить этот тег в код шаблона, то все страницы находящиеся по ЧПУ перестанут грузить стили, ява скрипты, и если я не ошибаюсь то и картинки
Теперь при заходе на страницу http://rsblog.ru/post/dobro-pozhalovat.html я попадаю на страничку статьи
а Вы? =)
На по следок хочу сказать, что мой способ реализации человеко-понятных урл не самый гибкий и функциональный, но тем не менее он работает. В следующем посте мы научим движок работать с ссылками категорий и формы обратной связи
Если у Вас есть какие вопросы, то пользуйтесь формой ниже
Если Вы еще не подписаны на мой блог, исправляйте дело и подпишитесь на RSS ленту блога через ридер, или же по почте, так Вы точно не пропустите новые заметки на блоге
Всего Вам наилучшего! У меня Все!
Исходник |
________
P.S.: В интернете нашел подборку довольно не плохих статей на тему веб-дизайн, если кто-то видит себя в будущем как дизайнера, то обязательно почитайте эти статьи, очень полезная информация.
mysql_escape_string($url);
1. .htaccess
2. getchpu
Далее файлы из админ панели. При условии что вы дошли до этой статьи
3. addcontent.php
4. allcontent.php
5. addmenu.php
6. eddmenu.php
http://site.ru/razrabotka-cms/uluchshenija/ - Категория
http://site.ru/razrabotka-cms/uluchshenija/funkcija-chpu.html - Заметка
Можете глянуть как там работает. Весь механизм в файлах (Если мне память не изменяет):
1. htaccess
2. getchpu.php
3. gettransform.php
Например в mysql подключение к БД производилось вот так:
В mysql обращение к БД производилось вот так:
Вот собственно и все отличия. Ну по крайней мере с процедурным подходом.
я вот начал изучать Javascript и вот написал вот такой код:
вот демо: http://udiscuz.sibwebgroup.ru/optimizaciya-udiscuz.shtml
Заранее очень благодарю!
Вот ссылка на плагин, а вот дока
например вот есть функция у модуля:
Во-первых я понятие не имею, зачем Вы его используете в данном месте.
Во-вторых данный символ просто глушит вывод ошибки. Обычно его используют для того что бы написать свой собственный, детализированный обработчик ерроров.
а вот вопрос насчёт оптимизации SQLi запросов...
у меня после очистки кеш идёт:
<!-- Общее количество MySQLi запросов 13 -->
после заполнение кешом:
<!-- Общее количество MySQLi запросов 7 -->
и вот вы решали такую проблему? я слышал можно это сделать через JOIN но я хз что и как...гуглил и нашел статью на хабре но я нечего не понял
например вот так выглядел бы оптимизированный модуль последних комментариев
p.s: только я его не тестил, может какую синтаксическую ошибку допустил.
вот оригинал:
Parse error: syntax error, unexpected $end in Z:\home\udiscuz.ru\www\source\modules\news.php on line 173
http://rghost.ru/50327775
Попробуйте вот этот файл
http://rghost.ru/50331479
Когда уже вы сделаете релиз?
и сделайте пожалуйста небольшой обзор перед тем как вы опубликуете RS-Site
и расскажите о его приемуществах. заранее спасибо! =)
При включенном ЧПУ неправильно обрабатывает якоря на странице. Т.е. ссылки типа http://japson.ru/#mechta.
Подскажите, пожалуйста, мне в данном случае как решить проблему: что-то вписать в htaccess или в getchpu() обработчик писать?
Спасибо заранее.
Вот подскажите мне, непонятливому, где Вы объявляете переменные $dirDB и $url??? Не могу найти.
Зашёл на ваш сайт с поисковика по запросам с ЧПУ. Прочитал, описание и комментарии. При чтении описания попалась на глаза ссылка которая вела на страничку с пробной версией блога. Заинтересовался скачал, вкинул на денвер посмотрел.
Вещь нормальная. Минимализм на 5 с плюсом как раз такой и искал. один недостаток что все прикрасы что вы описываете на вашем сайте нужно вкручивать самому. А не охота да и возраст уже не тот чтобы по долгу разбираться во всех тонкостях.
Лет пять назад попался бы мне ваш сайт тогда бы может ещё и потрудился.