Приветствую Вас на продолжение цикла статей Разработка CMS В этой статье, как Вы могли понять из заголовка, мы будем создавать простенькое меню, для нашего блога... Суть модуля проста, выборки из базы данных названий ссылок, собственно сами ссылки, вклеивание этой информации в наш шаблон и вывод с генерированного кода на экран пользователя. Шаблон для пунктов меню мы уже создавали в статье верстка
Ну что ж, начнем пожалуй с создание новой таблицы в базе данных, в которой мы будем хранить название ссылок, и сами ссылки. Таблица пока что будет состоять из 3-х столбцов, и будет содержать (пока что) минимум информации. Я дам Вам экспорт созданной мной таблицы, с уже двумя ссылками:
CREATE TABLE IF NOT EXISTS `menu` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`href` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=3 ;
INSERT INTO `menu` (`id`, `name`, `href`) VALUES
(1, 'Главная', 'index.php'),
(2, 'Статья', 'index.php?blog=1');
Содержимое базы данных сейчас не сильно важна, мы будем ее наполнять лишь на стадии создание админ панели, так что пока не заморачивайтесь по этому поводу...
Следующим шагом я предлагаю создать шаблон для пунктов меню, нужный кусок кода лежит в нашем главном шаблоне index.html, между комментариями <!--МЕНЮ-->...<!--МЕНЮ-->
<!--МЕНЮ-->
<p align="center">Меню</p>
<div class="div_menu"><a class="menu_link" href="#">ссылка 1</a></div>
<div class="div_menu"><a class="menu_link" href="#">ссылка 2</a></div>
<div class="div_menu"><a class="menu_link" href="#">ссылка 3</a></div>
<div class="div_menu"><a class="menu_link" href="#">ссылка 4</a></div>
<div class="div_menu"><a class="menu_link" href="#">ссылка 5</a></div>
<div class="div_menu"><a class="menu_link" href="#">ссылка 6</a></div>
<div class="div_menu"><a class="menu_link" href="#">ссылка 7</a></div>
<div class="div_menu"><a class="menu_link" href="#">ссылка 8</a></div>
<!--МЕНЮ-->
Стоит сказать что в этом куске кода, несомненно есть лишние строчки
Так же в шаблоне стоит вклеить код-слова для последующей замены их, вот что получилось:
<p align="center">Меню</p>
<div class="div_menu"><a class="menu_link" href="[_href]">[_link]</a></div>
Тут есть очень неприятный момент. Вспомните статью написание модуля "Мини новостей", там мы циклом выводили один и тот же html код. Тут же, если выводит таким же циклом, то мы будем дублировать вот эту страку
<p align="center">Меню</p>
Что бы этого избежать, я начал использовать метки, которые обозначали, какой кусок шаблона можно циклить, а какой нет.. Собственно смысл прост, отметить код-словами кусок html кода, который мы вырежем посредством функции preg_match(), и будем дублировать только этот кусок, оставляя в покое тег p. Теперь вставим в шаблон эти новые код-слова, вот готовый шаблон, который я назвал menu.html и сохранил в папку templates
<p align="center">Меню</p>
[_divmenu]
<div class="div_menu"><a class="menu_link" href="[_href]">[_link]</a></div>
[_divmenu]
[_divmenu] - и есть наше код-слова. Когда наш модуль наткнется на него, он поймет что заключенный в нем код и есть тот кусок, который нужно дублировать, создавая тем самым пункты меню.
Шаблон у нас есть, значит пора приступать к самому модулю. Модуль представляет собой функцию, в которой генерируется html код, после чего выводится на экран пользователя. Все написанные нами модули очень похожи, поэтому если вы вникали в логику работы каждого из них, то без труда разберетесь и в этом. Вот код с комментариями:
<?
function menu()
{
$result_index = mysql_query("SELECT * FROM menu");//Выводим из базы данных все пункты меню
$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);//Вырезаем из шаблона ту
//часть, которая будет повторяться, то есть блок
//<div class="div_menu"><a class="menu_link" href="[_href]">[_link]</a></div>
do//Цикл do while
{
$edd_tamp = $div_menu[1];//Так как на придется править шаблон,
//то лучше его сохранить в отдельную переменную, иначе нам придется
//пользоваться функцией file() чаще чем 1 раз, а это нагрузка на сервер
//Замены идентификаторов на переменные из базы данных
$edd_tamp = str_replace("[_href]",$myrow_index[href],$edd_tamp);//Ссылка
$edd_tamp = str_replace("[_link]",$myrow_index[name],$edd_tamp);//Текст ссылки
$menu .= $edd_tamp;// Склеиваем весь с генерированный код в одну переменную
}
while($myrow_index = mysql_fetch_array($result_index));
$menu = preg_replace("/\[_divmenu\].*?\[_divmenu\]/s",$menu,$sm_read);//Вместо [_divmenu]...[_divmenu]
//вклеиваем наш с генерированный код из $menu
}
else $menu = "";//Если записей нет, то вывести это сообщение
return $menu;//Выводим с генерированный html код
}
?>
Я надеюсь тут все понятно. Сохраняем этот код в файл menu.php и помещаем в папку moduls. Нам осталось просто подключить этот модуль в файле index.php и отредактировать наш главный шаблон inex.html
Помещаем этот код:
//МОДУЛЬ МЕНЮ
include("moduls/menu.php");
$menu = menu();//Выводим результат функции в переменную, которая отобразится на экране пользователя
//МОДУЛЬ МЕНЮ
в файл index.php перед строчкой:
include("templates/index.html");После чего заходим в файл index.html и вместо:
<!--МЕНЮ-->
<p align="center">Меню</p>
<div class="div_menu"><a class="menu_link" href="#">ссылка 1</a></div>
<div class="div_menu"><a class="menu_link" href="#">ссылка 2</a></div>
<div class="div_menu"><a class="menu_link" href="#">ссылка 3</a></div>
<div class="div_menu"><a class="menu_link" href="#">ссылка 4</a></div>
<div class="div_menu"><a class="menu_link" href="#">ссылка 5</a></div>
<div class="div_menu"><a class="menu_link" href="#">ссылка 6</a></div>
<div class="div_menu"><a class="menu_link" href="#">ссылка 7</a></div>
<div class="div_menu"><a class="menu_link" href="#">ссылка 8</a></div>
<!--МЕНЮ-->
пишем
<!--МЕНЮ-->
<?=$menu?>
<!--МЕНЮ-->
Думаю понятно для чего
Сохраняем все это дело, и запускаем...Вуаля! наше простенькое меню готово
Если есть какие то вопросы, задавайте в комментариях, постараюсь ответить
Удачи!
![]() |
Исходник |