Всем доброго времени суток! Спасибо, что заглянули на мой блог! Сегодня мы продолжим учить наш движок автоматически менять динамические ссылки на ЧПУ, пополняя тем самым цикл "Создать блог с нуля". В прошлой заметки мы работали с главной страницей и страницами категории, сегодня же мы проделаем подобную операцию с модулем меню.
Почему я рассматриваю модуль в отдельном посте? Пускай метод смены динамичной ссылки на ЧПУ, у меню, очень схож с методом смены динамичных ссылок на ЧПУ у главной страницы и категории, тем не менее есть отличия! Поэтому, что бы Вас не запутать, я решил описать редактирования меню в отдельной заметке.
Что нам потребуется сделать?
В общем то это все, что нам необходимо будет сегодня сделать!
Заметка для тех, кто на блоге в первые. Как Вы могли заметить, материал в этом посте не несет для Вас никакой ценности, так как этот пост, как и большинство на моем блоге, является частью глобального цикла статей "Создать блог с нуля".
Цикл рассчитан на аудиторию, которая хочет научится программировать на php не осваивая тонну теории. Цикл повествует о создание небольшого движка персонального блога, тем самым дает возможность освоить базовые навыки php на практике!
Если Вам интересен данный цикл, то переходите по ссылке выше и приступайте к изучению изложенного мной материала.
Если Вы планируете задержаться на моем блоге, то обязательно подпишитесь на RSS ленту блога через ридер, или же по почте, так Вы точно не пропустите новые заметки цикла "Создать блог с нуля"!
Нам необходимо найти в файле подключение модуля меню, и прописать в скобках переменную chpu. Вот как выглядит подключение модуля теперь:
//МОДУЛЬ МЕНЮ
include("moduls/menu.php");
$menu = menu($chpu);//Выводим результат функции в переменную, которая отобразится на экране пользователя
//МОДУЛЬ МЕНЮ
На этом исправление в этом файле закончены =)
Думал, думал как лучше выложить исправления данной функции, решил привести Вам полный код, после чего описать все поправки (как в прочем я всегда и делаю =))
function menu($chpu)
{
$result_index = mysql_query("SELECT * FROM menu ORDER BY position");//Выводим из базы данных все пункты меню
$myrow_index = mysql_fetch_array($result_index);
if($myrow_index != "")//Проверяем есть ли в базе данных записи
{//Если есть...
$sm_read = file("templates/menu.html");//...подключаем шаблон
$sm_read = implode("",$sm_read);//функция file() возвращаем массив, поэтому склеиваем его
preg_match("/\[_divmenu\](.*?)\[_divmenu\]/s",$sm_read,$div_menu);//Вырезаем из шаблона ту
//часть, которая будет повторяться
$i=0;//переменная позволяющая создать многомерный массив
do//Цикл do while
{
$commMASS[$i] = array($myrow_index[id],//0 - ID пункта
$myrow_index[name],//1 - Имя пункта
$myrow_index[href],//2 - Ссылка (# - нет ссылки; Пустота - Категория; "http://site.ru/page2.html" - Прямая ссылка)
$myrow_index[podmenu],//3 - ID родительного пункта
$myrow_index[nameurl]//4 - имя ЧПУ
);
$i++;//при каждом цикле меняем элемент многомерного массива на единицу
}
while($myrow_index = mysql_fetch_array($result_index));
$menu = station(0,$commMASS,$div_menu[1],0,$chpu);//функция генерации пунктов стартовые параметры:
//0 - Вывод главных пунктов,
//$commMASS - Многомерный массив со всеми пунктами,
//$div_menu[1] - часть шаблона,
//0 - вложенность - стартовая вложенность нулевая
//$chpu - Режим отображение ссылок на блоге
$menu = preg_replace("/\[_divmenu\].*?\[_divmenu\]/s",$menu,$sm_read);//Вместо [_divmenu]...[_divmenu]
//вклеиваем наш с генерированный код из $menu
}
else $menu = "";//Если записей нет, то вывести это сообщение
return $menu;//Выводим с генерированный html код
}
Я внес следующие изменения:
function menu($chpu)
{
...
}
$commMASS[$i] = array($myrow_index[id],//0 - ID пункта
$myrow_index[name],//1 - Имя пункта
$myrow_index[href],//2 - Ссылка (# - нет ссылки; Пустота - Категория; "http://site.ru/page2.html" - Прямая ссылка)
$myrow_index[podmenu],//3 - ID родительного пункта
$myrow_index[nameurl]//4 - имя ЧПУ
);
$menu = station(0,$commMASS,$div_menu[1],0,$chpu);//функция генерации пунктов стартовые параметры:
//0 - Вывод главных пунктов,
//$commMASS - Многомерный массив со всеми пунктами,
//$div_menu[1] - часть шаблона,
//0 - вложенность - стартовая вложенность нулевая
//$chpu - Режим отображение ссылок на блоге
Вроде ничего не забыл...
Действуем так же, с начало полный код функции, а после вывешу описание:
function station($stat,$commMASS,$temp,$BC,$chpu)
{
for($i=0;isset($commMASS[$i]);$i++)//глобальный цикл for
{
if($commMASS[$i][3] == $stat)//если podmenu пункта равно переменной stat
{
$edd_tamp = $temp;//Так как на придется править шаблон,
//то лучше его сохранить в отдельную переменную, иначе нам придется
//пользоваться функцией file() чаще чем 1 раз, а это нагрузка на сервер
//Замены идентификаторов на переменные из базы данных
if($commMASS[$i][2] == "")
{
if($chpu == 0)$href = "<a href=\"index.php?cat=".$commMASS[$i][0]."\">".$commMASS[$i][1]."</a>";//если нет ссылки то генерируем категорию (Динамичная ссылка)
else $href = "<a href=\"category/".$commMASS[$i][4]."\">".$commMASS[$i][1]."</a>";//ссылка с именем ЧПУ
}
else//если поле href не пусто
{
if($commMASS[$i][2] != "#")$href = "<a href=\"".$commMASS[$i][2]."\">".$commMASS[$i][1]."</a>";//если поле href не содержит значок "#" значит генерируем прямую ссылку
else $href = $commMASS[$i][1];//если содержит значок "#" значит пункт является не ссылкой, поэтому выводим только имя
}
$style = $BC * 10;//рассчитываем отступ от края в пикселях
$newBC = $BC + 1;//прибавляем к вложенности единицу
$podmenu = station($commMASS[$i][0],$commMASS,$temp,$newBC,$chpu);//перезапускаем функцию с новыми параметрами:
//$commMASS[$i][0] - id обрабатываемого пункта
//$commMASS - массив со всеми пунктами
//$temp - шаблон
//$newBC - новый уровень вложенности
$edd_tamp = str_replace("[_podmenu]",$podmenu,$edd_tamp);//код-слово заместо которого вставляется пункты которые являются подпунктами
$edd_tamp = str_replace("[_style]",$style,$edd_tamp);//отступ от левого края в пикселях
$edd_tamp = str_replace("[_station]",$href,$edd_tamp);//Ссылка
$menu .= $edd_tamp;// Склеиваем весь с генерированный код в одну переменную
}
}
if(!isset($menu))return "";//если переменная menu не была создана то результатом будет пустота
else return $menu;//если создана переменная menu то выводим ее
}
Я ввел следующие изменения:
function station($stat,$commMASS,$temp,$BC,$chpu)
{
...
}
if($commMASS[$i][2] == "")
{
if($chpu == 0)$href = "<a href=\"index.php?cat=".$commMASS[$i][0]."\">".$commMASS[$i][1]."</a>";//если нет ссылки то генерируем категорию (Динамичная ссылка)
else $href = "<a href=\"category/".$commMASS[$i][4]."\">".$commMASS[$i][1]."</a>";//ссылка с именем ЧПУ
}
В зависимости от значения переменной chpu, к переменной href присвоется значение, ЧПУ или динамическая ссылка.
$podmenu = station($commMASS[$i][0],$commMASS,$temp,$newBC,$chpu);//перезапускаем функцию с новыми параметрами:
//$commMASS[$i][0] - id обрабатываемого пункта
//$commMASS - массив со всеми пунктами
//$temp - шаблон
//$newBC - новый уровень вложенности
Если я ничего не забыл, то Вы должны лицезреть ЧПУ у ссылки категории в меню
Может показаться что все уже сделано, но это не так =( Нам еще необходимо переделать формы комментариев и контактов, ибо в атрибутах action у них стоят динамические ссылки.
Так же необходимо будет создать ридерект, в случае если пользователь заходит по не существующей человеко-понятной ссылке, на ошибку 404 или же просто на главную страницу
Если у Вас есть какие либо вопросы, то пользуйтесь формой ниже. Если Вы еще не подписаны на мой блог, то обязательно подпишитесь на RSS ленту блога через ридер, или же по почте, так Вы не пропустите новые заметки!
Всего Вам наилучшего! У меня Все!
Исходник |
_______
Для новичков создание сайтов штука не простая, и парой очень сложная и даже не возможная. Ведь не каждый может разобраться в дебрях программирования, а у многих просто нет времени на это! Для таких случаев есть сайты вроде http://www.rere-design.ru, которые предлагают своим клиентам за определенную сумму создать им сайт. Если Вы не в силах создать сайт самостоятельно, то не мучайте свои нервы и обращайтесь к знающим людям =)