Приветствую Вас на продолжение цикла статей Разработка 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?>
<!--МЕНЮ-->
Думаю понятно для чего Сохраняем все это дело, и запускаем...Вуаля! наше простенькое меню готово Если есть какие то вопросы, задавайте в комментариях, постараюсь ответить Удачи!
Исходник |
1) А не проще ли вообще вынести <p align="center">Меню</p> в index.html, а в menu.php не заморачиваться и выводить данные как в новостях? Вроде мы ничего не потеряем, а даже приобретем - код будет более читабельным не во вред логике.
2) Не могли бы Вы пояснить, что здесь происходит вообще?
preg_match("/\[_divmenu\](.*?)\[_divmenu\]/s",$sm_read,$div_menu);
Понятно что мы в $sm_read ищем совпадения с вот этим: /\[_divmenu\](.*?)\[_divmenu\]/s . Вот здесь не могли бы поподробнее объяснить что да как происходит? Что за флаг /s и за последовательность (.*?) ?
else $menu = "";//Если записей нет, то вывести это сообщение
Тут явно echo должен быть :)
2. Это регулярное выражение. Про основы почитать можете тут
http://rio-shaman.ru/index.php?blog=44
Что же касается флага "s", то он позволяет проводить поиск учитывая переносы строки.
.*? - Означает, что между [_divmenu] и [_divmenu] находятся совершенно любые символы.
<div class="div_menu"><a class="menu_link" href="ссылка 1">пункт 1</a></div>
<div class="div_menu"><a class="menu_link" href="ссылка 2">пункт 1</a></div>
...и т.д....
После чего, содержимое этой переменной вклеивается в главный шаблон index.html, то есть в место
<!--МЕНЮ-->
<?=$menu?>
<!--МЕНЮ-->
будет
<!--МЕНЮ-->
<div class="div_menu"><a class="menu_link" href="ссылка 1">пункт 1</a></div>
<div class="div_menu"><a class="menu_link" href="ссылка 2">пункт 1</a></div>
...и т.д....
<!--МЕНЮ-->
У тебя прекрасное изложение материала. Прошел почти все уроки раздела и все работает ОТЛИЧНО. Конечно еще не все понятно, так как на голом php пишу впервые. Я по большей части дизайнер и работаю под joomla. Но хочу создать и свою CMS чтобы лучше понимать как устроены другие. А может на ней да же и работать, если хорошо получится. )
Но есть вопрос, который уже изрядно погуглил и ничего толкового не обнаружил. Как сделать свой класс (а значит и свой стиль) у активного пункта меню, а так же сделать его неактивным при нахождении на странице пункта.
Зараннее благодарен за ответ.
Проблем с кодировкой больше нет)
Warning: mysql_fetch_array() expects parameter 1 to be resource, boolean given in V:\home\test.ru\www\adm\moduls\menu.php on line 5
я написав скрипт але він працює тільки до перезавантаження сторінки
$(document).ready(function() {
$(".list").click(function () {
$(this).toggleClass("active");
});
});
Например:
<p align="center"><?if ($m == 'блаблабла') echo 'меню1; else echo 'меню2';'?></p>
[_divmenu]
<div class="div_menu"><a class="menu_link" href="[_href]">[_link]</a></div>
[_divmenu]
ну или какой нить альтернативный вариант, заранее спс!!!
PS: Материал супер!!!
Альтернативный вариант это переделка модуля, а именно скрипта который отвечает за обработку содержимого шаблона (замена код-слов)
echo '<p align="center">';
<?if ($m == 'блаблабла') echo 'меню1; else echo 'меню2';'?>
echo '</p> ';
do{
printf('<div class="div_menu"><a class="menu_link" href="[_href]">[_link]</a></div>',arr,arr,arr)
}
while()
Просто пример даю такой примитивный, на самом деле там таблица и много ее где скрипт вставлять придется, а не хотелось бы из модуля кашу делать, может дадите совет дельный, если можно пример или хоть в какую сторону рыть, заранее спасибо!
Пример:
<p align="center">[своя_метка]</p>
[_divmenu]
<div class="div_menu"><a class="menu_link" href="[_href]">[_link]</a></div>
[_divmenu]
вот эта строка:
тут я на просторах интернета нашел скрипт который отображает Браузер и OS и я записываю IP и Данные браузера в базу и вот эти скрипты работают через других функции и вот как выводить в комментариях чтобы из колонки browser обрабатывалось из переменной $result_browser.
вот этот скрипт:
скачать сборку: http://dcms-social.ru/forum/14/7/8753/
представляю вам 2 версию тестового релиза uDiscuz!
uDiscuz! - это CMS для создание сайта новостей с элементами форумного обсуждение новостей.
Что нового?
* uDiscuz! v 0.0.0 RELEASE TEST 2 *
(*) Отображение Браузер и OS в комментариях (исправлено).
(*) Вход в административную панель (исправлена кодировка).
(*) Добавление новостей (исправлена ошибка при добавление новости).
(*) BBEditor (исправлена ошибка с кодами).
(*) Установка uDiscuz! (исправлены стили установки).
(+) Вход в административную панель (добавлен новый дизайн).
(+) Добавление новостей (добавлен новый дизайн).
(+) Обсуждения новости (добавлена проверка на цензуру).
(+) Административная панель MyAdmin (добавлена проверка на существования папки установки).
Демо:
http://oswall.tw1.ru/
Демо админки:
http://oswall.tw1.ru/udsadmin/
Логин: admin
Пароль: admin
Скачать uDiscuz!: http://dcms-social.ru/user/personalfiles/1192/1592/?id_file=3212&page=1
на строчку в коде "$menu .= $edd_tamp;" Причем ругается на все подобные объявления переменных. PHP 5.4.7