Динамично меню
СЪЗДАВАНЕ НА САЙТ С ДИНАМИЧНО МЕНЮ И ДИНАМИЧНО СЪДЪРЖАНИЕ, без БД

Предполагам, че много често сте се сблъсквали с проблема, как да направите динамично меню или страница с динамично

съдържание, ако не използвате База данни и не искате кода за самото меню да е по-тромав, отколкото всичко останало в

страницата.
Обикновено в подобни ситуации се използва оператора 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>


Демо ще дам по-късно.
Ако има въпроси - форума.

УРОКЪТ Е СПЕЦИАЛНО НАПИСАН ЗА УЕБ-ТУРИСТ!


PP: Ето и демо: http://probna.awardspace.com/demo14/

По кода има объркани имена на променливи (някои от тях оправих), а и форматирането е ужасно, ще ги оправя. За сега бъдете внимателни, ако ще пробвате скрипта.


/ Трябва да сте регистриран за да напишете коментар /
От: jenipuh2
14:15 11-11-2009

Къде се слага нещо неработи
От: diamandieff
12:40 02-01-2010
jenipuh2 имаш ЛС
От: vasilev5
9:40 07-02-2010
Как може да стане с две менюта?
1