|
|
|
| Во первых строках хочу сообщить что мне очень понравился ваш форум. Доброжелательный он какой-то. Молодцы. А то на других завалят и айда глумится чё мол ты такой тупой у нас делаешь.
Типа сами киборгами родились... Ну да ладно...
Вопрос у меня. Можно ди организовать (точне как оптимально организовать) меню которое будет подсвечивать название текущего раздела. Подсветку с помощью CSS я сделал. Но так ли необходимо использовать HTTP_REFERER? А может функция какая завалялась?
Меню горизонтальное вынесено в файл header.php.
Я вроде сделал, но как-то криво. Просто перебирал в цикле (switch) все варианты...
Заранее спасибо за пвнимание. | |
|
|
|
|
|
|
|
для: Axxil
(22.07.2004 в 11:56)
| | У нас Дизайнер уж очень меню любит :))) Но ответить он сможет только вечером (сейчас он в турне по клиентам :). | |
|
|
|
|
|
|
|
для: cheops
(22.07.2004 в 12:27)
| | Что ж будем ждать... | |
|
|
|
|
|
|
|
для: Axxil
(22.07.2004 в 13:00)
| | Не претендуя на истину в последней инстанции... Я подсвечиваю нужный пункт так:
Хотя поначалу я тоже switch-ем пользовался :)
Итак для всех пунктов меню идет стиль - назовем его normal (class=normal). Для активного пункта меню создадим стиль - active (class=active)
На всем страницах подключаем меню следующим образом:
<?php
// выделим, например, пункт 3 меню
// id_menu - идентификатор активного пункта
$id_menu = 3;
// подключаем файл с пунктами меню
require_once("menu.php");
?>
|
А вот и сам файл menu.php
<?php
eval("\$active$id_menu = 1;");
function stylemenu($activemenu)
{
if (isset($activemenu))
{
return "class=active";
}
else
{
return "class=normal";
}
}
?>
<a <? echo stylemenu($active1) ?> href="page1.php">О компании</a><br>
<a <? echo stylemenu($active2) ?> href="page2.php">Продукция</a><br>
<a <? echo stylemenu($active3) ?> href="page3.php">Контакты</a><br>
<a <? echo stylemenu($active4) ?> href="page4.php">Документы</a><br>
<a <? echo stylemenu($active5) ?> href="page5.php">Карта сайта</a><br>
|
Переменная выбранного пункта меню инициализируется при помощи функции eval.
eval("\$active$id_menu = 1;");
К примеру, для третьего пункта ($id_menu = 3) меню эта конструкция инициализирует переменную $active3 = 1; Переменные для других пунктов останутся не инициализированными.
В каждом пункте меню для динамического определения стиля вызываем функцию stylemenu.
Она проверяет инициализирована ли передаваемая переменная и в зависимости от этого возвращает строку с нужным стилем. Если инициализирована, то возвращает "class=active". Если нет, то "class=normal"
| |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(22.07.2004 в 18:38)
| | Это понятно. Интересная штука. Но загвоздка в том что меню прописано в одном(!) файле header.php который автоматом добавляется ко всем страницам. Как же тогда быть с определением id?
(похоже без switch не обойтись :)))
например файл header.php
Так оптимально? Или можно лучше?
Я извиняюсь, но не знаю как добавить код непосредственно в сообщение, поэтому добавил с помощью прикрепить. | |
|
|
|
|
|
|
|
для: Axxil
(23.07.2004 в 09:45)
| | Но вроде бы все равно ничего не мешает поступать так как предложил я.
А $id_menu нужно определять прямо на страницах (main.php, photos.php и т.д.) перед подключанием header.php.
Может, конечно, мы не поняли друг друга...
А как подключается header.php на страницах?
И как выглядит файл menu.php?
Если не трудно - положите эти части кода в форум.
А чтобы в сообщение добавить код нужно абрамлять тэгами <code> и </code>. Только скобки не угловые, а квадратные [ ]. На странице добавления сообщения тэги, которые можно использовать описаны чуть выше формы ввода текста.
| |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(23.07.2004 в 10:15)
| | основные файлы у меня организованы следующим образом:
например news.php
<?php
include("../mainfiles/header.php");
include("../mainfiles/leftbox.php");
include("centerbox.php");
include("../mainfiles/rightbox.php");
include("../mainfiles/footer.php");
?>
|
где header.php, leftbox.php, centerbox.php, rightbox.php, footer.php соответствующие логические части страницы.
---------------------------------------
неаder+menu
---------------------------------------
leftbox * Centerbox *rightbox
---------------------------------------
footer+menu
---------------------------------------
в Header.php и footer.php теперь добавлю файл menu.php c вашими рекомендациями.
<?php
$id_menu = 3;
include("../mainfiles/header.php");// сюда включён файл menu.php
include("../mainfiles/leftbox.php");
include("centerbox.php");
include("../mainfiles/rightbox.php");
include("../mainfiles/footer.php");// сюда включён файл menu.php
?>
|
Весь вопрос состоял в том, что я не понимал как в отсутствии глобальных переменных можно $id_menu передать в menu.php
Теперь, обратив внимание на строку
<?php
eval("\$active$id_menu = 1;");
?>
|
я всё понял. Функция eval как то бегло рассматривается в литературе, а оказывается заслуживает большего уважения:)
Огромное вам спасибо.
Пойду трудится на благо Ruнета ;)))
P.S. Ещё вопрос можно?
чем отличается начало php кода <? от <?php | |
|
|
|
|
|
|
|
для: Axxil
(23.07.2004 в 10:42)
| | >Весь вопрос состоял в том, что я не понимал как в отсутствии глобальных переменных можно $id_menu передать в menu.php
Да, если сначала определять переменную, а потом подключать файл, то переменная будет доступна в подключаемом файле. Так как сначала файл подключается (сборка всей страницы), а только потом происходит выполнение кода в ней.
>чем отличается начало php кода <? от <?php
В принципе ничем. Но рhp (php.ini) можно настроить так, что бы он не понимал сокрашенную запись (<?) , а понимал только полную (<?php). Но мне серверов, настроенных таким образом еще не встречалось :) | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(23.07.2004 в 10:58)
| | На каждой странице мы определяем одну переменную id_menu.
например $id_menu=3. А как же остальные. Они же остаются неопределёнными...
Неужели придётся на каждой странице их обнулять? | |
|
|
|
|
|
|
|
для: Axxil
(23.07.2004 в 11:47)
| | В смысле? Какие остальные?
Id_menu = идентификатор активного пункта меню. На каждой странице он один. Естественно ничего обнулять не надо.
Мы определяем эту переменную перед вставкой header.php на каждой странице.
В header.php функция eval создает переменную - имя, которой зависит от id_menu
<?php
eval("\$active$id_menu = 1;");
?>
|
Т.е. для id_menu=3 eval создает active3=1
Если бы мы передали id_menu=2, то с помощью eval была бы создана переменная active2=1
В каждом пункте меню нужно определить стиль. Делаем это след. образом
<a <? echo stylemenu($active1) ?> href="page1.php">О компании</a><br>
|
В каждом пункте меню мы вызываем функцию stylemenu() и передаем ей в качестве параметра переменные - для первого пункта передаем переменную $active1, для второго $active2, для третьего $active3 и так далее. И только одна из всех этих переданных переменных будет инициализирована. Остальные просто не существует на самом деле.
А функция stylemenu() именно это и проверяет. Если переданная переменная не инициализирована (ее нет), то она возвращает строку со стилем для невыделенного пункта меню. А если переменная инициализирована (функцией eval ), то будет возврашена строка со стилем для активного пункта меню. | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(23.07.2004 в 15:35)
| | Но вся штука в том что интерпретатор ругается на то что не определены переменные отличные от id_menu.
Таким образом пришлось сделать так:
<?php
$active1=0;
$active2=0;
$active3=0;
$active4=0;
$active5=0;
$active6=0;
$active7=0;
$active8=0;
eval("\$active$id_menu = 1;");
function stylemenu($actmenu)
{
if ($actmenu==1)
{
return "class=mainmenuactive";
}
else
{
return "class=mainmenu";
}
}
include("menuitem.php");
?>
|
Вроде работает.
Но всё равно спасибо за очень ценный совет. | |
|
|
|
|
|
|
|
для: Axxil
(23.07.2004 в 15:58)
| | >Но вся штука в том что интерпретатор ругается на то что не определены переменные отличные от id_menu.
А, ну есть такое дело. Как бы даже и не ругается, а предупреждает. Обычно PHP.INI настраивают таким образом чтобы подавить вывод подобных предепреждений.
B для работы и для отладки вполне хватает вот таких опций:
error_reporting = E_ALL & ~E_NOTICE
|
Это одна из директив php.ini
http://www.softtime.ru/info/articlephp.php?id_article=9 | |
|
|
|
|
|
|
|
для: glsv (Дизайнер)
(23.07.2004 в 16:48)
| | А что делать если на сервере эта штука отключена? И добраться до php.ini невозможно. | |
|
|
|
|
|
|
|
для: Axxil
(23.07.2004 в 18:03)
| | достаточно в начале скрипта указать
<?
error_reporting = E_ALL & ~E_NOTICE ;
.......................
?>
|
| |
|
|
|
|
|
|
|
для: Axxil
(23.07.2004 в 18:03)
| | >А что делать если на сервере эта штука отключена? И
>добраться до php.ini невозможно.
Ваш админ изверг, если оставил включёнными вывод предупреждений! :)))
Если у вас не отключены вложенные includ-ы, как на нашем сервере :(, вы можете использовать символ @ перед include для подавления вывода предупреждений и ошибок...
http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=109&id_post=678 | |
|
|
|