Вопрос по подключению меню на сайте

12
R1
На сайте с 20.04.2017
Offline
30
1084

Коллеги, здравствуйте! Вопрос следующий, решил спросить у сообщества, правильно ли я делаю и не будет ли у меня серьёзных проблем в обозримом будущем с данной конструкцией. Итак, я делаю свой личный сайт-визитку на PHP-Includes (РНР Инклудах). Проблема возникла с тем, чтобы подключить меню на сайте, и не просто его подключить в виде внешнего php файла, ("menu.inc.php"), а чтобы при этом подсвечивался активный пункт меню.

Иными словами, чтобы вы понимали, я хочу сделать таким образом, чтобы когда у меня на сайт будет 500+ страниц, меню у меня подгружалось на все эти страницы с одного-единственного внешнего файла "menu.inc.php". Если вдруг я приму решение добавить ещё один пункт меню, мне необходимо будет его добавлять не на всех 500+ страницах отдельно, а только в одном внешнем файле, что жизненно важно для меня.

В общем суть такова... Но вот с реализацией этого вопроса у меня возникли некоторые трудности, поскольку сам РНР я знаю пока-что лишь на самом начальном уровне, а сайт делать УЖЕ надо (точнее, надо было ещё позавчера). Потому, не мудрствуя лукаво, я решил взять очень простую, скажем так "деревянную" РНР-конструкцию и реализовать вышеуказанное меню в отдельном файле таким вот незамысловатым образом:


// Мой внешний РНР-файл "menu.inc.php" выглядит следующим образом -
<?php
if($current_page == "index") {
?>
<ul>
<li class="active"><a href="/index.php">index</a></li>
<li><a href="/about.php">about</a></li>
<li><a href="/contacts.php">contacts</a></li>
<li><a href="/formula.php">formula</a></li>
<li><a href="/goods.php">goods</a></li>
<li><a href="/love.php">love</a></li>
<li><a href="/addition.php">addition</a></li>
<li><a href="/end.php">end</a></li>
</ul>
<?php
} elseif($current_page == "about") {
?>
<ul>
<li><a href="/index.php">index</a></li>
<li class="active"><a href="/about.php">about</a></li>
<li><a href="/contacts.php">contacts</a></li>
<li><a href="/formula.php">formula</a></li>
<li><a href="/goods.php">goods</a></li>
<li><a href="/love.php">love</a></li>
<li><a href="/addition.php">addition</a></li>
<li><a href="/end.php">end</a></li>
</ul>
<?php
} elseif($current_page == "contacts") {
?>
<ul>
<li><a href="/index.php">index</a></li>
<li><a href="/about.php">about</a></li>
<li class="active"><a href="/contacts.php">contacts</a></li>
<li><a href="/formula.php">formula</a></li>
<li><a href="/goods.php">goods</a></li>
<li><a href="/love.php">love</a></li>
<li><a href="/addition.php">addition</a></li>
<li><a href="/end.php">end</a></li>
</ul>
.....
.....
<?php
}
?>

На самом сайте, например, в страничке "index.php" или "about.php" я подключаю вышеизложенный файл "menu.inc.php" таким вот образом:


В документе "index.php" :
....
<?php
$current_page = "index";
include "./included/menu.inc.php";
?>
....
....
....
В документе "about.php" :
....
<?php
$current_page = "about";
include "./included/menu.inc.php";
?>

Соответственно, переменная "$current_page" принимает на страничке то значение, в соответствии с документом, в котором необходимо это самое меню подсвечивать. И, таким образом, внешний файл меню у меня подключается к каждой страничке сайта, при этом, само меню лежит удалённо. Как вам такой вариант выхода из этой ситуации, с учётом моих достаточно скудных познаний в самом РНР? Да, мне предлагали это сделать несколько иначе через конструкцию FOREACH, однако конструкция IF-ELSEIF-ELSE для меня ближе, я хотя-бы понимаю, что конкретно я делаю.

Заранее благодарен за все ваши замечания и пожелания!

Евгений Крупченко
На сайте с 27.09.2003
Offline
178
#1
roman1981:

PHP код:

это жесть конечно 🙄

а когда элементов меню будет 500 какая простыня там получится?

вот набросал по-быстрому исходя из поставленной задачи (и ничего более) добавлять class="active" в списке меню:

menu.php:

<?
$menu=[ '/index.php'=>'index',
'/about.php'=>'about',
'/contacts.php'=>'contacts',
];

$keys=array_keys($menu);
foreach($keys as $key)
{
echo "<li";
if($key==$_SERVER['SCRIPT_NAME'])
{
echo " class=\"active\"";
}
echo "><a href=\"$key\">$menu[$key]</a></li>";
}
?>

в массив $menu вписываем относительный путь к файлу и то как он в меню подписан будет.

и все. дальше в каждый файл просто вставляем:

index.php:

<?
include('menu.php');
?>

about.php:

<?
include('menu.php');
?>

contacts.php:

<?
include('menu.php');
?>

и по переменной $_SERVER['SCRIPT_NAME'] поймет скрипт где делать пометку class="active"

S
На сайте с 30.09.2016
Offline
469
#2
roman1981:
конструкция IF-ELSEIF-ELSE для меня ближе

Могу лишь повторить то, что Вам уже сказали несколько дней назад: это, мягко говоря, плохой код. Так называемый "индусский". Или "китайский".

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
R1
На сайте с 20.04.2017
Offline
30
#3

Sitealert

Да, согласен с вами, этот код так-себе... Но пока, наверное, оставлю его именно таким. Не думаю, что у меня там будет 500+ разделов меню. А если когда-то и станет такое количество, перепишу просто этот код на новый, оптимизированный формат. Ведь не сразу Москва строилась, не правда ли?

Хотя я понимаю, что искусство программирования - штука серьёзная. Спасибо ещё раз за ваши конструктивные замечания!

M
На сайте с 04.12.2013
Offline
223
#4

roman1981, сделайте хотя бы промежуточный вариант без цикла:


<li<?php if ($current_page=='index'): ?> class="active"<?php endif; ?>><a href="/index.php">index</a></li>

Иногда используют тернарный оператор, чтобы была только одна php-вставка:


<li<?= $current_page=='index'?' class="active"':'' ?>><a href="/index.php">index</a></li>

И так каждый пункт.

---------- Добавлено 23.01.2018 в 01:38 ----------

Ну еще можно if ... echo ..., чтобы было и ветвление, и одна вставка.

Домены и скрипт для коротких ссылок: https://u75.ru/domains-for-shortcuts
Arsh
На сайте с 21.03.2007
Offline
199
#5

ТС, обратите внимание.

Вы спрашиваете:

roman1981:
правильно ли я делаю

Вам отвечают - "неправильно".

Ваша реакция:

roman1981:
согласен с вами, этот код так-себе... Но пока, наверное, оставлю его именно таким

Вам понятно, что собеседник в результате чувствует, что над ним издеваются?

(PS Расхожее: "Код, который исполняется процессором, любой дурак написать может")

M
На сайте с 04.12.2013
Offline
223
#6

Во-во. ТС походу надеялся, что его подбодрят, а его опять ткнули носом, да еще припомнили тему, где его на ЭТОМ опустили.

R1
На сайте с 20.04.2017
Offline
30
#7

Эх... А я так надеялся, что найдётся хотя-бы один человек, который подбодрит меня, похвалит, подчеркнёт мою исключительность и невероятную сообразительность. Да ещё и коллегам мой код в пример будет ставить!

Так нет же, только ругают и ругают. Всё, не интересно тут с вами, пойду в другую песочницу играться. Вот только лопатку с ведёрком заберу...

M
На сайте с 04.12.2013
Offline
223
#8

roman1981, первый признак детсадовского мышления – отвечать на эмоциональные посты и игнорить посты по существу вопроса ;)

R1
На сайте с 20.04.2017
Offline
30
#9

miketomlin

Видно, что вы мне даже репутацию подпортили. Как по вашему - это не детсадовское мышление с вашей стороны? Рассуждаете о детсадовском мышлении, а сами как поступаете? ;)

M
На сайте с 04.12.2013
Offline
223
#10

Репу по правилам обсуждать нельзя. Безосновательно гнать на меня – очередной детсад. Успехов.

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий