За последние 24 часа нас посетили 34147 программистов и 1314 роботов. Сейчас ищут 927 программистов ...

Подсветка пунктов в меню

Тема в разделе "PHP для новичков", создана пользователем darkgod, 20 июн 2009.

  1. darkgod

    darkgod Активный пользователь

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    Подскажите плиз, как можно реализовать подсветку пунктов меню? Т.е. в каком месте нахожусь, ту и подсвечивать...
     
  2. Jensi

    Jensi Активный пользователь

    С нами с:
    9 апр 2009
    Сообщения:
    299
    Симпатии:
    0
    Типа навигации что ли? Ты находишься на определённой ссылке и она должна подсвечиваться? А если самому хорошо подумать?
     
  3. darkgod

    darkgod Активный пользователь

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    да, типа того...

    ды я сделал, но мне кажеца что получилось немного через ж... и не универсально... Помогите или доделать чтобы было универсально или скажите как сделать по другому.

    вот мое решение:
    PHP:
    1.  
    2. <?
    3. $current_link = explode("&", $_SERVER['REQUEST_URI']); // тут обрезаю ссылку для сравнения, ведь нужно чтобы подсвечивался весь модуль
    4. $href = 'index.php?mod=news'; // ссылка на модуль
    5.         if($current_link[0] == '/' . $href) {$class1 = 'class="current"';} // условие при котором будет подсвечивание
    6. $bm .= '<a href="' . $href . '" ' . $class1 . '>Новости</a>';
    7.  
    8. $href = 'index.php?mod=info&id=14'; // ссылка на отдельную страницу
    9. if($current_link[0].'&id=14' == '/' . $href) {$class2 = 'class="current"';} // условие для выполнения подсветки
    10. $bm .= '<a href="' . $href . '" ' . $class2 . '>О компании</a>';
    11.  
    12. $block_text = $bm;
    13. ?>
    14.  
    Но не нравится:
    Код (Text):
    1. $current_link[0].'&id=14' == '/' . $href
    потому как могут быть варианты и длинее (после &id=14 гипотетически может идти продолжение ссылки, и тогда это уже работать не будет), но как сделать их работоспособными я незнаю. И еще не нравится что для каждого класса приходится назначать свою переменную с классом - иначе начинают подсвечиваться все ссылки кроме последней.
     
  4. Black Raven

    Black Raven Активный пользователь

    С нами с:
    8 июн 2009
    Сообщения:
    25
    Симпатии:
    0
    1. Пункты меню могут быть в массиве, а перебирать их можно при помощи foreach
    2. А зачем разбивать строку запроса? $_GET отменили?
     
  5. darkgod

    darkgod Активный пользователь

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    Ну хорошо, допустим эти ссылки можно гетом прогнать...

    а что делать со ссылками вида:
    $href = 'info/namelink1.html';

    т.е. при использовании ЧПУ?
     
  6. Black Raven

    Black Raven Активный пользователь

    С нами с:
    8 июн 2009
    Сообщения:
    25
    Симпатии:
    0
    А при использовании чпу урл не разбирается на составляющие чтобы понять что нужно показать?
     
  7. darkgod

    darkgod Активный пользователь

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    Ну вот и я про тоже, а как можно тут сделать подсветку при использовании ЧПУ?
     
  8. Black Raven

    Black Raven Активный пользователь

    С нами с:
    8 июн 2009
    Сообщения:
    25
    Симпатии:
    0
    Ты не про тоже. ЧПУ разбирается на составляющие, вот и используй эти данные.
     
  9. darkgod

    darkgod Активный пользователь

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    Пример то паказать можно?
     
  10. Black Raven

    Black Raven Активный пользователь

    С нами с:
    8 июн 2009
    Сообщения:
    25
    Симпатии:
    0
    Можно, покажи :)
    Я не буду писать код, просто потому что не мне это нужно. Давай лучше ты напишешь маленький код и скажешь где и какие проблемы ты видишь.
     
  11. darkgod

    darkgod Активный пользователь

    С нами с:
    31 мар 2008
    Сообщения:
    201
    Симпатии:
    0
    смотри, через суперглобальные переменные я могу вытащить исходную строку запроса

    PHP:
    1. $_SERVER['QUERY_STRING']
    Но как теперь мне ее разбить на составляющие? чтобы выдрать значение mod и id

    Помоги плиз!
     
  12. Black Raven

    Black Raven Активный пользователь

    С нами с:
    8 июн 2009
    Сообщения:
    25
    Симпатии:
    0
    Давай так - ты пишешь php-код вывода меню без подсветки с использованием массива и foreach, а после этого сделаем подсветку.
     
  13. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    У меня в мане по оберткам реализовано так:

    PHP:
    1. <?php
    2. class Router {
    3.     public static function parse () {
    4.         $uri = $_SERVER['REQUEST_URI'];
    5.         $uri = self::removeExt($uri); // Обрезаем расширение
    6.         $uri = trim($uri, '/'); // Обрезаем с обоих сторон слеши
    7.         $uri = preg_replace('/\/+/', '/', $uri); // Множество слешей подряд заменяем одним
    8.         $uri = preg_replace('/\.+/', '.', $uri); // Множество точек подряд заменяем одной
    9.         $parts = explode('/', $uri); // Делим массив на части
    10.         self::route($parts); // Перенаправляем пользователя
    11.     }
    12.  
    13.     protected static function removeExt ($str) {
    14.         // Список доступных расширений. С любым их них страница будет работать
    15.         $extentions = array ('.html', '.htm', '.page', '.jsp', '.php', '.func');
    16.         foreach ($extentions as $ext) {
    17.             // Если на данное расширение заканчивается строка
    18.             if (preg_match("/$ext$/i", $str)) {
    19.                 // То мы обрезаем его и возвращаем строку без расширения
    20.                 return substr($str, 0, -strlen($ext));             
    21.             }
    22.         }
    23.         // Если у строки нету ни одного разрешенного расширения - возвращаем необрезанную строку
    24.         return $str;
    25.     }
    26.  
    27.     protected static function route ($parts) {
    28.         // Тут вообще делается перенаправление. Но пока только посмотрим на части нашего массива
    29.         print_r(array (
    30.             'uri' => $_SERVER['REQUEST_URI'],
    31.             'parts' => $parts
    32.         ));
    33.     }
    34. }
    35. Router::parse();
    36. ?>
    примеры результата:

    Код (Text):
    1. Array (
    2.     [uri] => /manual
    3.     [parts] => Array (
    4.             [0] => manual
    5.         )
    6. )
    7.  
    8. Array (
    9.     [uri] => /manual/Str/encode64.jsp
    10.     [parts] => Array (
    11.             [0] => manual
    12.             [1] => Str
    13.             [2] => encode64
    14.         )
    15. )
    А по поводу вопроса - невозможно сказать точно. Все зависит от того, какая у тебя структура проекта. Ну суть приблизительно такая:
    PHP:
    1. <?php
    2. $actid = isset($_GET['catid']) ? $_GET['catid'] : 0;
    3. $sql_cats = mysql_query("SELECT * from `cats`");
    4. while ($cats = mysql_fetch_array($sql_cats)) {
    5.     $class = ($actid == $cats['id']) ? 'submenu-active' : 'submenu';
    6.     echo "<li class='$class'><a href='index.php?catid=$cats[id]'>$cats[name]</a></li>";
    7. }
    8. ?>
    А ты уж сам подумай , как это реализвать у себя. Будет пища для ума
     
  14. Black Raven

    Black Raven Активный пользователь

    С нами с:
    8 июн 2009
    Сообщения:
    25
    Симпатии:
    0
    TheShock
    Человек не придумал что это можно массивами делать, а ты ему классы подсовываешь... У него всё руками написано, а ты ему mysql показываешь... Это вредная привычка вываливать на новичков всё и сразу - так и получаются люди, которые делают ООП ради ООП.
     
  15. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Black Raven, ну что значит "ООП ради ООП". В вышепривиденном коде, кстати, ни одного из трех принципов ООП (http://demon-riabev.by.ru/Programming/! ... l10_1.html) не показано. Только удобное и красивое разделение.

    Автор спросил: "Как разбить на составляющие $_SERVER['QUERY_STRING']?". Я привел пример легкого, понятного и прокомментированного кода, как это сделать

    Автор спросил: "Как реализовать подсветку текущего пункта меню?". Я привел пример кода в пять строк, где красиво и понятно любому более-менее программисту на пхп, что там происходит и позволит на базе этого кода создать свой алгоритм, который будет подходить его движку.

    Если человек считает, что он - программист на php, то он разберется в том коде, рано, или поздно. Если не разберется, то не судьба. При том, ТопикСтартер, вроде, человек неглупый.

    А подход, показанный в третьем сообщении, в корне неверный и рассказывать, как сделать что-то типа такого - тоже неверно. Пускай сразу ищет более рациональные подходы, пример которого я и показал. Ну или пускай создает статичные HTML-документы.
     
  16. Black Raven

    Black Raven Активный пользователь

    С нами с:
    8 июн 2009
    Сообщения:
    25
    Симпатии:
    0
    TheShock
    ООП ради ООП это когда человек услышал "ООП это клево" и создает объекты, которые впринципе не нужны, или объекты, которые отвечают за всё и сразу, или делают а-ля неймспейс для функция при помощи статических методов.

    Ну вот например скажи мне почему твой роутер сплошняком из статических методов? Или почему он сам знает о $_SERVER['REQUEST_URI'] - а если я захочу произвольную строку в него подать?

    Ну пошли его на мануал по строковым функциям. Ты хоть глазами посмотри и подумай ПОЧЕМУ он хочет разбить и ЧТО он хочет разбить.

    Ну-ка, давай-ка включим голову - может ему в $_GET надо поглядеть? Всё-таки даже при использовании ЧПУ там может быть флаг QSA, а?

    А глазами увидеть, что автор вообще плейн текст там корячит ты не смог, да? Он ща возьмет твой код, а потом будет ходить, показывать и спрашивать "А почему у меня не работает? Мне сказали, что этот код работает"

    Во-первых, уже проблема, если человек считает себя "программистом на пхп". Программист является программистом не из-за выбора языка, а из-за склада ума. Ну и коль ты считаешь себя "программистом на пхп, который рано или поздно разберется" - иди на symfony-project.org, посмотри на роутер и выкинь свою поделку.

    Ой, а может еще смысл жизни мне объяснишь? "В КОРНЕ НЕВЕРНЫЙ" - ты Кнут или Фаулер? А может оба в одном лице? Ты хочешь сказать, что если я сделаю там пункты меню в массиве и перебором буду сравнивать какой-то из параметров пункта с полученным из запроса - это будет неверный подход?
     
  17. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    А нах URL парсить в разных режимах o_O
    mod_rewrite лишь представляет URL на уровне зароса.
    Например:

    PHP:
    1. <?
    2.  
    3. echo $_GET['do'];
    4.  
    5. ?>
    .htaccess
    Код (Text):
    1. RewriteEngine On
    2. RewriteRule ^index/([a-z0-9]+)$ index.php?mod=index&do=$1 [L,NC]
    http://site.ru/index/Hello -> выведет Hello
    http://site.ru/index.php?mod=index&do=Abc -> выведет Abc

    Парсить надо только сам URL на уровне кода и никак иначе.
     
  18. Kreker

    Kreker Старожил

    С нами с:
    8 апр 2007
    Сообщения:
    5.433
    Симпатии:
    0
    Разделы:
    <a href="/index" id="index">Главная</a>
    <a href="/articles" id="articles">Статьи</a>
    <a href="/news" id="news">Новости</a>

    Подсветка делается через JS. Ставите onload обработчик, который будет после загрузки страницы смотреть на ссылку и подсвечивать соответствующий пункт.
    Что-то типа такого:
    [js]window.onload = function () {
    var href = String(window.location);
    var pos = href.indexOf("/", 8);
    var pos2 = href.indexOf("/", pos2);
    var id = href.substr(pos+1, pos2);
    document.getElementById(id).style.color = "#ff0000";
    }[/js]
     
  19. TheShock

    TheShock Активный пользователь

    С нами с:
    30 май 2009
    Сообщения:
    1.255
    Симпатии:
    0
    Адрес:
    Київ
    Black Raven, у меня есть что ответить на твой пост, но не хочу поддерживать срач.
     
  20. DmitryWox

    DmitryWox Активный пользователь

    С нами с:
    16 июн 2009
    Сообщения:
    36
    Симпатии:
    0
    Я вообщето тоже думал что через js темболее после моего поста на счет php и js