Эта статья является полезным дополнением статьи как сделать сайт на PHP, поскольку она раскрывает содержание модуля menu.php. Ниже будет представлена собственная разработка меню на PHP, которая была написана с нуля в блокноте.
Этот код особенно будет полезен для динамичных сайтов, которые имеют самописные движки. Я предложу два варианта кода, которые имеют незначительные отличия (в чем различие будет пояснено после).
Для начала приведу примерную структуру сайта, для которого подойдет это меню. Структура сайта должна иметь следующий вид (классический вид):
/index.html /razdel_1/ /razdel_1/articles_1.html /razdel_1/articles_2.html ... /razdel_2/ /razdel_2/articles_1.html /razdel_2/articles_2.html ... ... ... /razdel_N/articles_2.html
Сайт может содержать у разделов еще и подразделы:
/razdel_1/podzaderl_1/ /razdel_1/podzaderl_1/articles_1.html /razdel_1/podzaderl_1/articles_2.html ... /razdel_1/podzaderl_2/articles_1.html /razdel_1/podzaderl_2/articles_2.html
Такая структура также будет работать для нашего меню лишь с небольшими отличиями.
Я предлагаю создать отдельный файл для меню на php. Например, menu.php было бы отличным названием для такого файлика. Для реализации меню также представлен стиль меню в CSS, чтобы сразу сделать его более менее красивым. Естественно этот стиль дается только для ознакомления, поскольку дизайны у сайтов очень разные.
Код для стиля меню в CSS:
.menu { height:42px; padding:0 0 0 16px; background:url(images/spacer.png) repeat; } .menu li { display:block; float:left; } .menu li.active { background: #000011; } .menu a { color:#FFF; display:block; line-height:42px; text-decoration:none; padding:0 14px; } .menu a:hover { background:url(images/spacer.png) repeat; }
Теперь, давайте рассмотрим первый вариант реализации меню на PHP, который является немного упрощенным.
Первый вариант кода меню на PHP
<?php $i = 0; $array_menu = array(); $array_menu[$i]['url']='/'; $array_menu[$i++]['name']='Главная'; $array_menu[$i]['url']='/razdel_1/'; $array_menu[$i++]['name']='Название раздела 1'; $array_menu[$i]['url']='/razdel_2/'; $array_menu[$i++]['name']='Название раздела 2'; ... $array_menu[$i]['url']='/razdel_N/'; $array_menu[$i++]['name']='Название раздела N'; echo "<ul>\n"; for ($i=0;$i<count($array_menu);$i++) { echo ($_SERVER["REQUEST_URI"] == $array_menu[$i]['url']) ? '<li class="active">': '<li>'; echo "<a href=\"".$array_menu[$i]['url']."\">".$array_menu[$i]['name']."</a></li>\n"; } echo "</ul>"; ?>
Меню можно разделить на две части. Первая содержит информационный массив $array_menu, в который заносятся названия наших разделов с ссылками на разделы. Есть вариант забить эти данные в базу данных mySQL, но особо смысла в этом нет, поскольку выборка совсем небольшая, поэтому на скорость работы это никак не повлияет.
Вторая часть содержит вывод меню через цикл for. В цикле происходит сравнение адреса сайта с адресом из массива $array_menu. Если есть совпадение, то выводим очередной раздел меню со специальным классом active: <li class="active">, иначе просто <li>. Это позволяет нам выделить каким-то цветом ту часть меню, в котором находится пользователь. На мой взгляд, это необходимая вещь для любого сайта, чтобы пользователь мог понимать в каком разделе он находится.
Порядок следования в массиве будет сохранятся и при выводе меню на сайте. То есть массив надо заполнять в порядке, в котором нужно выводить меню.
Примечание:
В случае, если URL (адреса) заголовком разделов имеют вид:
/razdel_1
или такой
/razdel_1/nazvanie_razdela.html
то в array_menu нужно записывать точное совпадение:
$array_menu[$i]['url']='/razdel_1'
или для второго случая:
$array_menu[$i]['url']='/razdel_1/nazvanie_razdela.html';
Как работает первый вариант меню?
Он подсвечивает меню только, если Вы находитесь по адресу заголовка раздела. Например, если адрес страницы будет /razdel_1/articles_1.html, то меню никак не будет подсвечиваться.
Второй вариант кода является модифицированным вариантом первого и предусматривает возможность подсвечивания меню даже в статьях, которые находятся в разделах.
Второй вариант кода меню на PHP
<?php $i = 0; $array_menu = array(); $array_menu[$i]['url']='/'; $array_menu[$i++]['name']='Главная'; $array_menu[$i]['url']='/razdel_1/'; $array_menu[$i++]['name']='Название раздела 1'; $array_menu[$i]['url']='/razdel_2/'; $array_menu[$i++]['name']='Название раздела 2'; ... $array_menu[$i]['url']='/razdel_N/'; $array_menu[$i++]['name']='Название раздела N'; function str_count($str) { $ctr = 0; $k = strlen($str); for($i=0; $i<$k; $i++) { if($str[$i] == '/') $ctr++; } return $ctr; } $URL = $_SERVER["REQUEST_URI"]; $proverka_urovnya = str_count($URL); function func_uri($str) { $res = substr($str,0,strrpos($str,'/')); return $res; } echo "<ul class='menu'>"; for ($i=0;$i<count($array_menu);$i++) { if($proverka_urovnya != 1) { echo func_uri($URL) == func_uri($array_menu[$i]['url']) ? '<li class="active">': '<li>'; echo "<a href=".$array_menu[$i]['url'].">".$array_menu[$i]['title']."</a></li>"; } else { echo ($URL) == ($array_menu[$i]['url']) ? '<li class="active">': '<li>'; echo "<a href=".$array_menu[$i]['url'].">".$array_menu[$i]['title']."</a></li>"; } } echo "</ul>"; ?>
Комментарии к коду:
Первая часть кода осталась без изменений и предусматривает только задание массива с адресами и названиями разделов. Сильные изменения коснулись второй части меню. Во-первых появилась функция str_count($str), которая подсчитывает количество вхождений слэшов "/". Это нужно для того, чтобы правильно идентифицировать главную страницу сайта.
Вторая функция func_uri($str) оставляет только ту часть URL, которая есть до первого вхождения слэша "/". Например, если адрес страницы /razdel_1/articles_1.html, то функция func_uri(/razdel_1/articles_1.html) обрежет articles_1.html и вернет только URL раздела: /razdel_1/.
Этот код легко можно модифицировать и дальше. Например, если у разделов есть подразделы, которые желательно как-то выделять.
Читайте также:
• Как сделать форму обратной связи на php с каптчей
• Коды спецсимволов в HTML
• Коды и названия html цветов для сайта
• Операции над числами в php
• Поразрядные операции в php
• Условный оператор if...else в php
• Переключатель switch в php
• Операторы цикла (while, do..while, for)