Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Умное меню.
 
 автор: Axxil   (22.07.2004 в 11:56)   письмо автору
 
 

Во первых строках хочу сообщить что мне очень понравился ваш форум. Доброжелательный он какой-то. Молодцы. А то на других завалят и айда глумится чё мол ты такой тупой у нас делаешь.
Типа сами киборгами родились... Ну да ладно...
Вопрос у меня. Можно ди организовать (точне как оптимально организовать) меню которое будет подсвечивать название текущего раздела. Подсветку с помощью CSS я сделал. Но так ли необходимо использовать HTTP_REFERER? А может функция какая завалялась?
Меню горизонтальное вынесено в файл header.php.
Я вроде сделал, но как-то криво. Просто перебирал в цикле (switch) все варианты...
Заранее спасибо за пвнимание.

   
 
 автор: cheops   (22.07.2004 в 12:27)   письмо автору
 
   для: Axxil   (22.07.2004 в 11:56)
 

У нас Дизайнер уж очень меню любит :))) Но ответить он сможет только вечером (сейчас он в турне по клиентам :).

   
 
 автор: Axxil   (22.07.2004 в 13:00)   письмо автору
 
   для: cheops   (22.07.2004 в 12:27)
 

Что ж будем ждать...

   
 
 автор: glsv (Дизайнер)   (22.07.2004 в 18:38)   письмо автору
 
   для: 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"

   
 
 автор: Axxil   (23.07.2004 в 09:45)   письмо автору
 
   для: glsv (Дизайнер)   (22.07.2004 в 18:38)
 

Это понятно. Интересная штука. Но загвоздка в том что меню прописано в одном(!) файле header.php который автоматом добавляется ко всем страницам. Как же тогда быть с определением id?
(похоже без switch не обойтись :)))
например файл header.php
Так оптимально? Или можно лучше?
Я извиняюсь, но не знаю как добавить код непосредственно в сообщение, поэтому добавил с помощью прикрепить.

   
 
 автор: glsv (Дизайнер)   (23.07.2004 в 10:15)   письмо автору
 
   для: Axxil   (23.07.2004 в 09:45)
 

Но вроде бы все равно ничего не мешает поступать так как предложил я.

А $id_menu нужно определять прямо на страницах (main.php, photos.php и т.д.) перед подключанием header.php.

Может, конечно, мы не поняли друг друга...
А как подключается header.php на страницах?
И как выглядит файл menu.php?

Если не трудно - положите эти части кода в форум.

А чтобы в сообщение добавить код нужно абрамлять тэгами <code> и </code>. Только скобки не угловые, а квадратные [ ]. На странице добавления сообщения тэги, которые можно использовать описаны чуть выше формы ввода текста.

   
 
 автор: Axxil   (23.07.2004 в 10:42)   письмо автору
 
   для: 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

   
 
 автор: glsv (Дизайнер)   (23.07.2004 в 10:58)   письмо автору
 
   для: Axxil   (23.07.2004 в 10:42)
 

>Весь вопрос состоял в том, что я не понимал как в отсутствии глобальных переменных можно $id_menu передать в menu.php

Да, если сначала определять переменную, а потом подключать файл, то переменная будет доступна в подключаемом файле. Так как сначала файл подключается (сборка всей страницы), а только потом происходит выполнение кода в ней.

>чем отличается начало php кода <? от <?php
В принципе ничем. Но рhp (php.ini) можно настроить так, что бы он не понимал сокрашенную запись (<?) , а понимал только полную (<?php). Но мне серверов, настроенных таким образом еще не встречалось :)

   
 
 автор: Axxil   (23.07.2004 в 11:47)   письмо автору
 
   для: glsv (Дизайнер)   (23.07.2004 в 10:58)
 

На каждой странице мы определяем одну переменную id_menu.
например $id_menu=3. А как же остальные. Они же остаются неопределёнными...
Неужели придётся на каждой странице их обнулять?

   
 
 автор: glsv (Дизайнер)   (23.07.2004 в 15:35)   письмо автору
 
   для: 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 ), то будет возврашена строка со стилем для активного пункта меню.

   
 
 автор: Axxil   (23.07.2004 в 15:58)   письмо автору
 
   для: 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");
 
?>

Вроде работает.
Но всё равно спасибо за очень ценный совет.

   
 
 автор: glsv (Дизайнер)   (23.07.2004 в 16:48)   письмо автору
 
   для: 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

   
 
 автор: Axxil   (23.07.2004 в 18:03)   письмо автору
 
   для: glsv (Дизайнер)   (23.07.2004 в 16:48)
 

А что делать если на сервере эта штука отключена? И добраться до php.ini невозможно.

   
 
 автор: Artem S.   (23.07.2004 в 22:13)   письмо автору
 
   для: Axxil   (23.07.2004 в 18:03)
 

достаточно в начале скрипта указать
<? 
error_reporting  
=  E_ALL & ~E_NOTICE ;
.......................
?>

   
 
 автор: cheops   (23.07.2004 в 22:20)   письмо автору
 
   для: 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

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования