Подскажите плиз, как можно реализовать подсветку пунктов меню? Т.е. в каком месте нахожусь, ту и подсвечивать...
Типа навигации что ли? Ты находишься на определённой ссылке и она должна подсвечиваться? А если самому хорошо подумать?
да, типа того... ды я сделал, но мне кажеца что получилось немного через ж... и не универсально... Помогите или доделать чтобы было универсально или скажите как сделать по другому. вот мое решение: PHP: <? $current_link = explode("&", $_SERVER['REQUEST_URI']); // тут обрезаю ссылку для сравнения, ведь нужно чтобы подсвечивался весь модуль $href = 'index.php?mod=news'; // ссылка на модуль if($current_link[0] == '/' . $href) {$class1 = 'class="current"';} // условие при котором будет подсвечивание $bm .= '<a href="' . $href . '" ' . $class1 . '>Новости</a>'; $href = 'index.php?mod=info&id=14'; // ссылка на отдельную страницу if($current_link[0].'&id=14' == '/' . $href) {$class2 = 'class="current"';} // условие для выполнения подсветки $bm .= '<a href="' . $href . '" ' . $class2 . '>О компании</a>'; $block_text = $bm; ?> Но не нравится: Код (Text): $current_link[0].'&id=14' == '/' . $href потому как могут быть варианты и длинее (после &id=14 гипотетически может идти продолжение ссылки, и тогда это уже работать не будет), но как сделать их работоспособными я незнаю. И еще не нравится что для каждого класса приходится назначать свою переменную с классом - иначе начинают подсвечиваться все ссылки кроме последней.
1. Пункты меню могут быть в массиве, а перебирать их можно при помощи foreach 2. А зачем разбивать строку запроса? $_GET отменили?
Ну хорошо, допустим эти ссылки можно гетом прогнать... а что делать со ссылками вида: $href = 'info/namelink1.html'; т.е. при использовании ЧПУ?
Можно, покажи Я не буду писать код, просто потому что не мне это нужно. Давай лучше ты напишешь маленький код и скажешь где и какие проблемы ты видишь.
смотри, через суперглобальные переменные я могу вытащить исходную строку запроса PHP: $_SERVER['QUERY_STRING'] Но как теперь мне ее разбить на составляющие? чтобы выдрать значение mod и id Помоги плиз!
Давай так - ты пишешь php-код вывода меню без подсветки с использованием массива и foreach, а после этого сделаем подсветку.
У меня в мане по оберткам реализовано так: PHP: <?php class Router { public static function parse () { $uri = $_SERVER['REQUEST_URI']; $uri = self::removeExt($uri); // Обрезаем расширение $uri = trim($uri, '/'); // Обрезаем с обоих сторон слеши $uri = preg_replace('/\/+/', '/', $uri); // Множество слешей подряд заменяем одним $uri = preg_replace('/\.+/', '.', $uri); // Множество точек подряд заменяем одной $parts = explode('/', $uri); // Делим массив на части self::route($parts); // Перенаправляем пользователя } protected static function removeExt ($str) { // Список доступных расширений. С любым их них страница будет работать $extentions = array ('.html', '.htm', '.page', '.jsp', '.php', '.func'); foreach ($extentions as $ext) { // Если на данное расширение заканчивается строка if (preg_match("/$ext$/i", $str)) { // То мы обрезаем его и возвращаем строку без расширения return substr($str, 0, -strlen($ext)); } } // Если у строки нету ни одного разрешенного расширения - возвращаем необрезанную строку return $str; } protected static function route ($parts) { // Тут вообще делается перенаправление. Но пока только посмотрим на части нашего массива print_r(array ( 'uri' => $_SERVER['REQUEST_URI'], 'parts' => $parts )); } } Router::parse(); ?> примеры результата: Код (Text): Array ( [uri] => /manual [parts] => Array ( [0] => manual ) ) Array ( [uri] => /manual/Str/encode64.jsp [parts] => Array ( [0] => manual [1] => Str [2] => encode64 ) ) А по поводу вопроса - невозможно сказать точно. Все зависит от того, какая у тебя структура проекта. Ну суть приблизительно такая: PHP: <?php $actid = isset($_GET['catid']) ? $_GET['catid'] : 0; $sql_cats = mysql_query("SELECT * from `cats`"); while ($cats = mysql_fetch_array($sql_cats)) { $class = ($actid == $cats['id']) ? 'submenu-active' : 'submenu'; echo "<li class='$class'><a href='index.php?catid=$cats[id]'>$cats[name]</a></li>"; } ?> А ты уж сам подумай , как это реализвать у себя. Будет пища для ума
TheShock Человек не придумал что это можно массивами делать, а ты ему классы подсовываешь... У него всё руками написано, а ты ему mysql показываешь... Это вредная привычка вываливать на новичков всё и сразу - так и получаются люди, которые делают ООП ради ООП.
Black Raven, ну что значит "ООП ради ООП". В вышепривиденном коде, кстати, ни одного из трех принципов ООП (http://demon-riabev.by.ru/Programming/! ... l10_1.html) не показано. Только удобное и красивое разделение. Автор спросил: "Как разбить на составляющие $_SERVER['QUERY_STRING']?". Я привел пример легкого, понятного и прокомментированного кода, как это сделать Автор спросил: "Как реализовать подсветку текущего пункта меню?". Я привел пример кода в пять строк, где красиво и понятно любому более-менее программисту на пхп, что там происходит и позволит на базе этого кода создать свой алгоритм, который будет подходить его движку. Если человек считает, что он - программист на php, то он разберется в том коде, рано, или поздно. Если не разберется, то не судьба. При том, ТопикСтартер, вроде, человек неглупый. А подход, показанный в третьем сообщении, в корне неверный и рассказывать, как сделать что-то типа такого - тоже неверно. Пускай сразу ищет более рациональные подходы, пример которого я и показал. Ну или пускай создает статичные HTML-документы.
TheShock ООП ради ООП это когда человек услышал "ООП это клево" и создает объекты, которые впринципе не нужны, или объекты, которые отвечают за всё и сразу, или делают а-ля неймспейс для функция при помощи статических методов. Ну вот например скажи мне почему твой роутер сплошняком из статических методов? Или почему он сам знает о $_SERVER['REQUEST_URI'] - а если я захочу произвольную строку в него подать? Ну пошли его на мануал по строковым функциям. Ты хоть глазами посмотри и подумай ПОЧЕМУ он хочет разбить и ЧТО он хочет разбить. Ну-ка, давай-ка включим голову - может ему в $_GET надо поглядеть? Всё-таки даже при использовании ЧПУ там может быть флаг QSA, а? А глазами увидеть, что автор вообще плейн текст там корячит ты не смог, да? Он ща возьмет твой код, а потом будет ходить, показывать и спрашивать "А почему у меня не работает? Мне сказали, что этот код работает" Во-первых, уже проблема, если человек считает себя "программистом на пхп". Программист является программистом не из-за выбора языка, а из-за склада ума. Ну и коль ты считаешь себя "программистом на пхп, который рано или поздно разберется" - иди на symfony-project.org, посмотри на роутер и выкинь свою поделку. Ой, а может еще смысл жизни мне объяснишь? "В КОРНЕ НЕВЕРНЫЙ" - ты Кнут или Фаулер? А может оба в одном лице? Ты хочешь сказать, что если я сделаю там пункты меню в массиве и перебором буду сравнивать какой-то из параметров пункта с полученным из запроса - это будет неверный подход?
А нах URL парсить в разных режимах mod_rewrite лишь представляет URL на уровне зароса. Например: PHP: <? echo $_GET['do']; ?> .htaccess Код (Text): RewriteEngine On 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 на уровне кода и никак иначе.
Разделы: <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]