Менюто на сайт в PHP, което се управлява от PHP скриптове, има свои собствени характеристики. Това не са просто абсолютни или относителни връзки, въпреки че това може да е така, но по правило динамично генерирани блокове от връзки в страничните панели със секции и подсекции и блокове от връзки от вътрешните страници на самия сайт. Динамично генерираното меню е много удобно, защото може да бъде вмъкнато навсякъде в сайта и най-важното в точното време. Тоест, когато преминавате към различни раздели и подраздели, можете динамично да разширявате различни блокове от менюто. Освен това те могат да бъдат различни не само по съдържание, но и по форма и дизайн. В статичен сайт също е напълно възможно да се правят такива трикове, но това ще струва допълнителни файлове с шаблони и много други трикове. Докато сайт, написан на PHP, не изисква нищо от това. Шаблонът ще остане такъв, какъвто е бил. Всичко ще се контролира от един или повече прости PHP скриптове.

За да проверите това, достатъчно е да напишете PHP скрипт, който да генерира динамично меню, например първата категория и да го принуди да разшири менюто на тази категория чрез предварително написан скрипт. Останалите заглавия могат да бъдат оформени по подобен начин. Освен това кодът на самия скрипт ще остане практически непроменен. Ще се промени само текстовият файл, което ще определи имената на връзките и самите връзки. Кодът за такъв скрипт е даден по-долу.

// Създател на менюта
$menu = @file($rubric1_menu);
$редове = брой($меню);
за ($i = 0; $i< $lines; $i++)
{
списък ($menu_link,$menu_name,$menu_title)=explode("::", $menu[$i]);
if($page == rub1_part1 и $i == 0) ($refcolor = "style="color:#cc0000"";)
elseif($page == rub1_part2 и $i == 1) ($refcolor = "style="color:#cc0000"";)
elseif($page == rub1_part3 и $i == 2) ($refcolor = "style="color:#cc0000"";)
иначе ($refcolor = "";)
$rubric1.="

  • ".$menu_name."
  • ";
    }
    ?>

    За да работи такъв скрипт, ви е необходим текстов файл, в който ще се съхраняват имената на връзките към менюто, самите връзки и тяхното заглавие. Създаването на такъв файл не е трудно, просто изпълнете командата File -> New от главното меню на програмата Dreamweaver, създайте нов html документ, както е описано по-рано, проверете и, ако е необходимо, променете кодирането на новия файл на UTF -8 и след това го запишете под името rubric1.dat в папката с данни, създадена преди това за него. Пълният път до този файл ще бъде D:/Mysitephp/data/rubric1.dat. Съдържанието на файла по-долу са самите връзки, техните имена и заглавия (съвети). Освен това, за да пуснете този скрипт в действие, той трябва да бъде свързан с помощта на функцията включвам ()в машината за шаблони main.php.

    Rub1_part1::Раздел 1::Раздел 1, рубрика 1::
    rub1_part2::Раздел 2::Раздел 2, рубрика 1::
    rub1_part3::Раздел 3::Раздел 3 рубрика 1::

    В допълнение, вие също трябва да създадете малък скрипт с настройки, които ще съхраняват пълния адрес на сайта, пътищата към папките на страниците и мета описанията на сайта, пътищата към файловете на менюто на сайта и да го свържете с помощта на функцията включвам ()в машината за шаблони main.php. За да направите това, трябва да създадете нов php файл и да го запишете под име като settings.php в папката php. Пълният път до файла ще бъде D:/Mysitephp/php/settings.php и съдържанието му е дадено по-долу.

    # папка с html документи
    $doctemplates = "шаблони";
    # пълен път до директорията на скрипта
    $turl="http://mysitephp.ru";
    # база данни с данни
    $rubric1_menu = "данни/rubric1.dat";
    ?>

    Как работи PHP скриптът за създаване на меню? Първо в променливата $menu с помощта на функцията файл ()Поместено е съдържанието на текстовия файл rubric1.dat. След това функцията брой ()отчита броя на редовете в текстов файл и функции списък ()И експлодирам ()самото меню се разширява в цикъл, където методът за залепване на линии заедно (операция точка . ) се формират редове от връзки с техните имена и заглавия, които след това се поставят в променливата $rubric1. Следва скриптът на машината за шаблони, където скриптът на менюто е свързан от функцията включвам (), премества съдържанието на променливата $rubric1 до желаното място на сайта, като използва описаната по-горе функция repl().

    Такова меню все още няма да работи, тъй като съдържа само самите връзки с всички необходими атрибути, но няма скрипт, който да гарантира прехода към тези връзки и отварянето на страници на сайта, които ще съответстват на тези връзки. След това ще разгледаме този PHP скрипт.

    След това можете да актуализирате проекта със скрипта за генериране на меню. Можете също така да изтеглите актуализирания проект на страницата, която ще се отвори след регистрация и активиране на безплатен абонамент в панела вдясно. Адресът на страницата трябва да бъде запазен. Именно на тази страница в бъдеще ще се появят връзки за изтегляне на актуализации на проекти, различни полезни скриптове, програми, уроци и видео уроци за проектиране на схеми, програмиране и изграждане на уебсайтове. за начинаещи.

    Изтегленият проект на php сайт, актуализиран с нови скриптове, вече може да бъде сравнен с това, което се е случило в резултат на описаните по-горе стъпки. След това, за да премахнете несъответствията, би било полезно напълно да замените проекта с изтегления, да изпълните операцията, да стартирате сървъра Denwer, да въведете mysitephp.ru в прозореца на браузъра и да видите какво ще излезе от него. Менюто на първия раздел трябва да се разшири в горната лява част на шаблона, както е показано на снимката по-долу.

    Отидете и се разтопете в любимата си социална мрежа

    Тъй като излага съдържанието на модула 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

    \n"; за ($i=0;$i ": "
  • "; ехо " ".$array_menu[$i]["име"]."
  • \n"; ) ехо ""; ?>

    Менюто може да бъде разделено на две части. Първият съдържа информационния масив $array_menu, който съдържа имената на нашите секции с връзки към секции. Има опция за въвеждане на тези данни в базата данни mySQL, но няма особен смисъл в това, тъй като извадката е много малка, така че това няма да повлияе на скоростта на работа.

    Втората част съдържа изхода на менюто чрез for цикъл. Цикълът сравнява адреса на сайта с адреса от масива $array_menu. Ако има съвпадение, показваме следващия раздел на менюто със специален активен клас:

  • , иначе просто
  • . Това ни позволява да подчертаем с някакъв цвят частта от менюто, в която се намира потребителят. Според мен това е необходимо нещо за всеки сайт, за да може потребителят да разбере в кой раздел се намира.

    Редът в масива ще се запази, когато менюто се показва на сайта. Тоест масивът трябва да се попълни в реда, в който трябва да се показва менюто.

    Забележка:
    Ако URL адресите (адресите) на заглавията на секциите изглеждат така:
    /раздел_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

    "; за ($i=0;$i ": "
  • "; echo "".$array_menu[$i]["title"]."
  • "; ) else ( echo ($URL) == ($array_menu[$i]["url"]) ? "
  • ": "
  • "; echo "".$array_menu[$i]["title"]."
  • "; ) ) ехо ""; ?>

    Точно това ще разгледаме сега. И така, задачата е да направите вертикално меню под формата на падащ списък.

    Как може това да се приложи в PHP? Много просто! Например, имаме файл index.php,който в зависимост от избраната секция в падащия списък трябва да показва съответното съдържание на страницата. Това се изпълнява по следния начин:

    1. Създаваме файлове във формат .html, които ще съдържат необходимото съдържание за извеждане.

    2. Създаваме (записваме) в скрипта index.php необходимите условия за показване на съответната информация.

    3. Разглеждаме създадения скрипт от гледна точка на сигурността на изпълнявания скрипт.

    Е, изглежда, че приключихме с теорията, нека преминем към практиката. Първо създаваме статични страници във формат .html, които ще съдържат необходимата информация. Можете да пишете там каквото искате :) В резултат на това трябва да имаме поне два файла first.html и second.html , така че след това да можем да направим колкото си искаме от тях, след като разберем основния алгоритъм на как работи кодът.

    За показване на падащ списък във файл index.phpСъздаваме html форма, а по-долу пишем PHP скрипт със следното съдържание:



    Меню PHP


    Падащо меню в PHP












    if (isset ($_GET ["къде" ]))
    {
    ако ($_GET ["къде" ]==1)
    $file = "first.html" ;
    if ($_GET ["къде" ]==2 )
    $file = "втори.html" ;
    включват ($ файл);
    }
    ?>


    Вече е готов кодът на падащото меню и най-интересното е, че ще функционира нормално, но от гледна точка на сигурността е уязвим.

    Уязвимостта на този скрипт е, че променливата $файлостава неинициализирана и в този случай стойността на автоматично създадената променлива отива директно във функцията включват, а тя от своя страна успешно я свързва (променливата) и я показва на екрана. И това може да не е само конфигурационният файл .htaccess. За да хакнете този скрипт, е достатъчно да подадете на параметъра where стойност, която не е предвидена от кода, например 3. И тъй като тази стойност не е предвидена от скрипта, тя е просто променлива $файлняма да претърпи инициализация. Следователно може да му бъде дадена произволна стойност чрез URL низа.

    http://localhost/index.php?where=3&file=.htaccess

    Но това е така, леко отклонение от темата. 😀

    Решението на този проблем е доста просто, променливо $файлпросто трябва да се инициализира преди употреба, т.е. да се присвои стойност по подразбиране.

    Тук, ако параметърът where се предаде на скрипта, тогава променливата ще бъде инициализирана правилно, в противен случай просто ще бъде празна. Ето как [безопасното] падащо меню се оказа в PHP.

    P.S. При създаването на сценарии е необходимо да се вземат предвид и съответно да се изключат всички възможни вектори на атака. Това е единственият начин да създадете проект, който да отговаря на правилата за безопасност и да бъде търсен от клиента. Ще се видим отново!

    Никой уебсайт не е пълен без навигация или, както го наричат ​​още, „меню на сайта“. И така, менюто на сайта може да бъде на едно ниво или на много нива под формата на дърво. Ако няма особени трудности по отношение на изпълнението с меню на едно ниво, тогава когато създавате меню на много нива, трябва да помислите внимателно.

    Най-важното в тази задача е да проектираме базата данни за нашето многостепенно меню. Нека създадем таблица Категории с три полета id, заглавие, родителкъдето:

    • ID- идентификатор
    • Заглавие- Име на менюто
    • Родител- Родител на категорията по подразбиране 0

    Полето отговаря за разклоняването на менюто РодителАко Родител = 0, тогава тази категория е родителската категория. За да добавите наследници към родителската категория, трябва да посочите в полето за родител IDправилният родител. Например:

    Таблици с категории

    Както се вижда от таблицата, категорията родител автомобилиима двама потомци - това е МаздаИ Хондасвързани по поле Родител. И категорията Мотоциклетидвама потомци са КавазакиИ Харли. В същото време категорията Лодки няма наследници. Надявам се, че разбирате как се свързват категории.

    След това преминаваме от думи към практика. Нека създадем таблица с категории.

    СЪЗДАВАНЕ НА ТАБЛИЦА, АКО НЕ СЪЩЕСТВУВА `categories` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `parent` int(10) unsigned NOT NULL, PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=20 ; -- -- `Категории` на данни от таблица -- ВМЪКНЕТЕ В `категории` (`id`, `title`, `parent`) СТОЙНОСТИ (1, "Автомобили", 0), (2, "Мотоциклети", 0) , (3, "Мазда", 1), (4, "Хонда", 1), (5, "Кавазаки", 2), (6, "Харлей", 2), (7, "Мазда 3", 3 ), (8, "Mazda 6", 3), (9, "Седан", 7), (10, "Хечбек", 7), (11, "Лодки", 0), (12, "Лифтбек", 8), (13, "Кросоувър", 8), (14, "Бяло", 13), (15, "Червено", 13), (16, "Черно", 13), (17, "Зелено", 13), (18, "Mazda CX", 3), (19, "Mazda MX", 3);

    Алгоритъмът на работа се състои от следното:

    Създайте връзка към базата данни

    query("ЗАДАДЕНИ ИМЕНА "utf8""); /* * Това е "официалният" обектно-ориентиран начин за това * но $connect_error не работеше до PHP версии 5.2.9 и 5.3.0.

    */ if ($mysqli->connect_error) ( die("Грешка при свързване (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * Ако трябва да сте сигурни в съвместимостта с версии преди 5.2 .9, * по-добре е да използвате този код */ if (mysqli_connect_error()) ( die("Грешка при свързване (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); )

    Писане на функция за получаване на данни от таблицата Категории

    //Вземете масива от нашето меню от базата данни като функция за масив getCat($mysqli)( $sql = "SELECT * FROM `categories`"; $res = $mysqli->query($sql); //Създайте масив, където ключът на масива е ИД на менюто $cat = array(); while($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) return $котка)

    Получаваме масив като този, където ключът на масива е ID на категорията.

    Функция за изграждане от масивно дърво от Tommy Lacroix

    //Функция за изграждане на дърво от масив от функцията на Tommy Lacroix getTree($dataset) ( $tree = array(); foreach ($dataset as $id => &$node) ( //Ако няма прикачени файлове if ( !$node[" parent"])( $tree[$id] = &$node; )else( //Ако има деца, след това итерация през масива $dataset[$node["parent"]]["childs "][$id] = &$ възел; ) върне $дърво;

    Получаваме масив под формата на дърво

    query("ЗАДАДЕНИ ИМЕНА "utf8""); /* * Това е "официалният" обектно-ориентиран начин за това * но $connect_error не работеше до PHP версии 5.2.9 и 5.3.0.
  • */ if ($mysqli->connect_error) ( die("Грешка при свързване (" . $mysqli->connect_errno . ") " . $mysqli->connect_error); ) /* * Ако трябва да сте сигурни в съвместимостта с версии преди 5.2 .9, * по-добре е да използвате този код */ if (mysqli_connect_error()) ( die("Грешка при свързване (" . mysqli_connect_errno() . ") " . mysqli_connect_error()); ) //Вземете масива от нашето меню от базата данни като функция за масив getCat($mysqli)( $sql = "SELECT * FROM `categories`"; $res = $mysqli->query($sql); //Създаване на масив, където ключът на масива е ИД на менюто $cat = array(); while ($row = $res->fetch_assoc())( $cat[$row["id"]] = $row; ) //Функция за изграждане на дърво от масив от функцията на Tommy Lacroix getTree($dataset) ( $tree = array(); foreach ($dataset as $id => &$node) ( //Ако няма прикачени файлове if (!$node[ "parent"])( $tree[$id] = &$node; )else( //Ако има потомци, тогава нека преминем през масива $dataset[$node["parent"]]["childs"][ $id] = &$node; ) ) return $tree ) //Получаване на подготвен масив с данни $cat = getCat($mysqli); //Създаване на дървовидно меню $tree = getTree($cat); //Шаблон за показване на меню под формата на дървовидна функция tplMenu($category)( $menu = "
      ". $category["title"].""; if(isset($category["childs"]))( $menu .= "
    ". showCat($category["childs"]) ."
  • "; ) $меню .= "
      "; return $menu; ) /** * Рекурсивно четене на нашия шаблон **/ function showCat($data)( $string = ""; foreach($data as $item)( $string .= tplMenu($item); ) return $string;) //Получаване на HTML маркировка $cat_menu = showCat($tree); //Показване на ехо "
    "; ?>

    ".$cat_menu."

    Резултат от работата

    Многостепенно меню в PHP + MySQL за админ панел Ако искате да използвате това меню в административния панел на вашия сайт, тогава трябва да пренапишете няколко функции, tplMenu().

    showCat()".$category["title"]." ".$str." ".$category["title"]."< $i; $j++){ $str .= "→"; } $i++; $menu .= showCat($category["childs"], $str); } return $menu; } /** * Рекурсивно считываем наш шаблон **/ function showCat($data, $str){ $string = ""; $str = $str; foreach($data as $item){ $string .= tplMenu($item, $str); } return $string; } //Получаем HTML разметку $cat_menu = showCat($tree, ""); //Выводим на экран echo ""; ?>

    ".$cat_menu."

    Изберете ". $cat_menu."

    Изберете Автомобили → Mazda →→ Mazda 3 →→→ Седан →→→ Хечбек →→ Mazda 6 →→→ Liftback →→→ Кросоувър →→→→ Бял →→→→ Червен → →→→ Черен →→→→ Зелен →→ Mazda CX →→ Mazda MX → Honda Motorcycles → Kawasaki → Harley Boats 23 април 2017 г.

    В предишните уроци разгледахме примери за това какво представляват масивите. В този урок ще използваме масиви на практика, за да създадем меню на уебсайт.

    Е, да кажем, че нашият сайт има 100 страници, всяка от които има едно и също меню. И изведнъж трябваше да променим елементи от менюто. Използвайки само HTML, ще трябва да направим редакции на 100 страници от сайта, което е много. Така че PHP ни идва на помощ в такива ситуации. Ще бъде достатъчно да промените елементите от менюто само веднъж в един файл.

    Сега да тръгваме.

    На локален хостинг в папката „ домейнисъздайте папка, наречена „ масив- меню. местен”.

    В тази папка създаваме четири файла: индекс. php, около. php, контакт. phpИ меню. php.

    !!! Синтаксисът на файла трябва да бъдеPHP.

    Във файла index.php пишем проста HTML рамка.




    charset="utf-8" >



    Начало


    включват("menu.php" );
    ?>

    Копирайте този код във файловете about.php и contact.php. Променяме само имената на страниците в етикета

    .

    Пишем код за менюто.

    Във файл меню.phpнапишете асоциативен масив.

    $меню = масив (
    "индекс "=> "index.php",
    "за" => "about.php",
    "контакти" => "contact.php"
    );
    ?>

    По-долу пишем меню с помощта на HTML тагове.

    В браузъра ще видим редовно меню под формата на списък.

    Щраквайки върху произволен елемент от менюто, ще отидем на съответната страница и менюто ще бъде на всички страници.

    Сега нека усложним задачата. Изтриваме всичко от файла меню.phpи...

    Пишем многомерен масив.




    charset="utf-8" >
    <span>Използване на масив за показване на меню на уебсайт.</span>


    $меню = масив (
    масив("връзка" => "Начало", "href"=> "index.php"),
    масив("връзка" => "За нас", "href"=> "about.php"),
    масив("връзка" => "Контакти", "href"=> "contact.php")
    );
    ?>



    И на последния етап...

    Чертане на меню с помощта на цикъл foreach.

    Премахване на списъка от файла menu.php

      и вместо това напишете следния код.

      ехо"

        " ;
        foreach($меню като$артикул)(
        ехо "
      • ($артикул)
      • " ;
        }

        В браузъра ще видим същия резултат.

        За да промените елементи от менюто, просто ги променете във файла меню.phpсамо веднъж.