Динамично меню
Автор: sizif
СЪЗДАВАНЕ НА САЙТ С ДИНАМИЧНО МЕНЮ И ДИНАМИЧНО СЪДЪРЖАНИЕ, без БД
Предполагам, че много често сте се сблъсквали с проблема, как да направите динамично меню или страница с динамично
съдържание, ако не използвате База данни и не искате кода за самото меню да е по-тромав, отколкото всичко останало в
страницата.
Обикновено в подобни ситуации се използва оператора switch(); но в този урок ще ви покажа по-удобен начин (и с доста повече
възможности за управление), базиран на организиране на информацията в масиви.
За начло е добре да определим, по какъв начин ще си обособим кода, дали в отделни файлове, които ще включваме чрез include();
дали ще ги четем или ще ги оформим в автономни блокове от код, разположени в основния файл.
За да бъде по-чист примера ще използвам инклуд.
И така, нека имаме 5 страници, разделени на 5 файла: nachalo.php, page_2.php, page_3.php, about_us.php и contact.php.
Ще имаме нужда от 2 допълнителни файла: menu.php (за менюто) и index.php (в който ще включваме всички файлове).
Ако държите на пестеливостта, а не на удобството при бъдещи редакции, бихте могли да съберете двата файла.
За да създадем все пак някаква страница, ще ни трябват още 2 файла, к нямат пряко отношение към принципа, който ще ви покажа:
head.php и bottom.php
ПЪРВА СТЪПКА:
Създаваме файла menu.php
Неговото съдържание започваме със създаването на 2 масива – $link[] и $name[]. Имената и на 2-та са произволни, можете да си ги смените, ако искате 🙂
<?
$link[]="home.php";
$link[]="page_2.php";
$link[]="page_3.php";
$link[]="about_us.php";
$link[]="contact.php";
$name[]="Начало";
$name[]="Втора страница";
$name[]="Трета страница";
$name[]="За нас";
$name[]="Контакти";
?>В тях, както виждате поставяме за елементи имената на файловете и имената на линковете. Бихте могли да премахнете
разширението от имената на файловете, ако всички са PHP-файлове, но ако не сте сигурни дали по-нататък няма да използвате и HTML-файлове, по-добре имената да са пълни.
В моя случай, масивите са описани като стандартни променливи, но бихте могли да ги създадете и линейно с array(); Видът им има само естетическо значение. По-важно е, индексирането на елементите в тях да започва от 0 (нула). защо – ще видите по долу.
Дотук имаме 2 масива. От тях ще изградим менюто:
<?
$self=$_SERVER['PHP_SELF'];
$kolko=count($link);
for($i=0; $i<$kolko; $i++)
{
$class="cheren";
if($i==$page){
$class="red";
}
$name_list=$name[$i];
$menu_list.="<A CLASS=\"$class\" HREF=\"$self?page=$i\">$name_list</A><BR>";
}
?>Чрез фор-цикъл обхождаме масивите и поставяме връзка (анчър) със следното съдържание:
<A CLASS=“класът от стиловия шаблон“ HREF=“адресът на основния файл + ГЕТ-променлива, наречена $p, на която присвояваме стойността на $i от текущата итерация на цикъла“>името на връзката, напр „За нас“</A>
Всички връзки се събират в една променлива $menu_list, чиято стойност ще принтираме с echo(); където решим.
Другата важна променлива, к сме получили е за броя на елементите в масива – $kolko. За да не ги търсим отново по-нататък, добре е да не я забравяме.
И с това приключваме менюто.
ОСНОВЕН ФАЙЛ:
Нашия основен файл ще е index.php.
Ето и неговото съдържание:
<?
if(isset($_GET['page']))
{
$page=intval($_GET['page']);
}
else
{
$page=0;
}
include('menu.php');
include('head.php');
if($page<=$kolko)
{
$file=$link[$page];
}
else
{
$file=$link[0];
}
include($file);
include('bottom.php');
?>С index.php приключихме най-важното – принципа, по който свързваме пряко менюто със съдръжанието.
Какво точно правим в него?
С първия Иф-оператор:
if(isset($_GET[‘page’]))
проверяваме за изпратена променлива в УРЛ-адреса. В нашия случай $page. Ако има изпратена, я приемаме, валидирайки я с intval();
Функцията служи за преобразуване на стойност до целочислен вид, но в този случай, ще ни спести грешки и ще предпази нашия скрипт от манипулации. Достатъчно е да се отбележи, че функцията връща число: нула, ако стойността е низ (текст) или цяло число, ако стойността е дроб.
Нашия масив е цифров, индексиран от 0. За да разберем кой файл да включим, разчитаме на масива и стойността на $page, която трябва да е цяло число. intval(); отговаря отлично на нашите нужди. (Повече по темата за защитата ан скриптовете в урока на Жоро за кавичките.)
В случай, че нямаме изпратена променлива, задаваме стойност на $page –> 0. Това отговаря на първия елемент от нашия масив, а именно хоум-страницата.
Във втория иф-оператор:
if($page<=$kolko)
проверяваме дали $page не е по-голяма от броя на елементите в нашите 2 масива. Ако отговаря на условието, извличаме името на файла за включване от масива $link[]:
$file=$link[$page];
Ако условието е невярно, т.е. стойността на $page е по-голяма от броя на елементите, значи потребителя е манипулирал адреса и тогава отново зареждаме файла, описан в първия елемент на масива:
$file=$link[0];
В нашия случай, включваме отново home.php
А ето и самото включване, което е стандартно:
include($file);
Сигурно забелязвате, че инклудваме менюто преди главата на документа. Това не е грешка. Ако си спомняте, събрахме цялото меню в една променлива – $menu_list, така че ще я принтираме в head.php.
Преди това обаче да създадем файловете за включване:
home.php:
Добре дошли!
<BR><BR>Това е първа страница. За да навигирате свободно, използвайте връзките в ляво!page_2.php:
Втора страница!
<BR><BR>Това е втора страница.
<BR>Дрън-дрън...
<BR>Дрън-дрън...
<BR>И т.н....page_3.php
Тази страница е трета!
<BR><BR>текста се повтаря :)
<BR>Дрън-дрън...
<BR>Дрън-дрън...
<BR>И т.н....about_us.php:
за мен!
<BR><BR>Описваме нескромно нашата иначе скромна персона :)
<BR>Дрън-дрън...
<BR>Дрън-дрън...
<BR>И т.н....contact.php:
Форма за контакт!
<BR><BR>Слагате си формата и скрипта за нейната обработка.
<BR>Тук може да има проблем с екшън-адреса...
<BR>Бихте могли да го зададете на ръка или да го оставите празен, така че да се събмитва в текущата страница, ако го
обработвате в този скирпт.
<BR>Или да го образувате динамично.А ето и допълнителните файлове:
head.php:
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=windows-1251">
<TITLE>тестова страница</TITLE>
<style type="text/css">
<!--
.cheren { color: #000 }
.red { color: #800000 }
-->
</style>
</HEAD>
<BODY BGCOLOR="#ffffff">
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0 WIDTH=100% HEIGHT=100%><!-- Golqma Tablica -->
<TBODY>
<TR><TD ALIGN="CENTER" VALIGN="TOP">
<TABLE CELLSPACING=0 BORDER=0 CELLPADDING=0 WIDTH=800><!-- Nachalo tablica TQLO -->
<TBODY>
<TR><TD WIDTH=800 HEIGHT=100 COLSPAN=3></TD></TR>
<TR>
<TD WIDTH=200 ALIGN="LEFT" VALIGN="TOP">МЕНЮ<BR><BR><? echo $menu_list; ?></TD>
<TD WIDTH=50></TD>
<TD WIDTH=550 ALIGN="LEFT" VALIGN="TOP">bottom.php:
</TD></TR>
<?
$godina=date('Y');
?>
<TR><TD WIDTH=800 HEIGHT=200 ALIGN="CENTER" VALIGN="BOTTOM" COLSPAN=3>Всички права запазени и дрън, дрън...
Година: <? echo $godina; ?></TD></TR>
</TBODY></TABLE>
</TD></TR>
</TBODY></TABLE><!-- End Golqma tablica -->
</BODY>
</HTML>Демо ще дам по-късно.
Ако има въпроси – форума.
УРОКЪТ Е СПЕЦИАЛНО НАПИСАН ЗА УЕБ-ТУРИСТ!
По кода има объркани имена на променливи (някои от тях оправих), а и форматирането е ужасно, ще ги оправя. За сега бъдете внимателни, ако ще пробвате скрипта.


