CodeIgniter: как «выделить» ссылку на страницу, на которой пользователь в данный момент включен?

Довольно новый для CodeIgniter, все еще захватывающий подход MVC. Мне просто интересно, что лучший способ решить эту проблему:

Я получил свою навигационную панель, выделяющую текущую активную ссылку:

<a href="index.hml" id="active">Index</a> <a href="blog.hml">Blog</a> 

Теперь, когда я перехожу в blog.html, я хочу, чтобы id = "active" соответственно сдвигался. Обычно я назначаю переменную каждой ссылке, а затем устанавливаю ее значение «id =» active ». Почему-то я не думаю, что это лучший способ. Любые мысли?

Обновление (12 сентября 2012 г.) С тех пор, как я спросил об этом, я перешел в Кохану и расширил модуль, созданный полностью для этой цели. Теперь все, что мне нужно сделать, это указать мои пункты меню в массиве config, а выделение происходит автоматически. Модуль находится здесь .

Прежде всего, вы не должны использовать id для такого рода вещей, id должен указывать уникальный идентификационный номер для каждого элемента DOM на странице, для чего мы лучше всего используем класс.

Code Igniter предоставляет множество помощников и классов, которые становятся частью наших инструментов, возможно, вы уже слышали о «сегментах URL».

$ this-> uri-> segment (n )

Позволяет вам получить определенный сегмент. Где n – номер сегмента, который вы хотите получить. Сегменты пронумерованы слева направо. Например, если ваш полный URL-адрес:

http://example.com/index.php/news/local/metro/crime_is_up

Номера сегментов будут такими:

  1. Новости
  2. местный
  3. метро
  4. crime_is_up

http://codeigniter.com/user_guide/libraries/uri.html

вы можете использовать это для извлечения текущего сегмента URL, который представляет активную страницу, которую вы фактически показываете в браузере.

Неспецифичный для CI, это просто логические проверки, снова ссылающиеся на текущее имя страницы.

Когда вы получаете имя страницы в CI, например,

 $pageName = 'blog.html'; 

Затем вы можете сделать следующее

 <a href="index.html" <?php echo $pageName == 'index.html' ? 'id="active"' : ''; ?>>Index</a> <a href="blog.html" <?php echo $pageName == 'blog.html' ? 'id="active"' : ''; ?>>Blog</a> 

Я использовал пример @Calle, работал очень хорошо … Мне пришлось использовать пользовательский url-захват вместо CI current_url (), поскольку я обошел файл index.php с .htaccess. Я также добавил правильный тег атрибута.

Примечания для новичков Я упаковал этот файл в «помощники» под названием «menu_helper.php» и загрузил его через контроллер $ this-> load-> helper ('menu');

хелперы / menu_helper.php

 if ( ! function_exists('menu_anchor')) { function menu_anchor($uri = '', $title = '', $attributes = '') { $title = (string) $title; if ( ! is_array($uri)) { $site_url = ( ! preg_match('!^\w+://! i', $uri)) ? site_url($uri) : $uri; } else { $site_url = site_url($uri); } if ($title == '') { $title = $site_url; } if ($attributes != '') { $attributes = _parse_attributes($attributes); } $current_url = (!empty($_SERVER['HTTPS'])) ? "https://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI'] : "http://".$_SERVER['SERVER_NAME'].$_SERVER['REQUEST_URI']; $attributes .= ($site_url == $current_url) ? 'class="active"' : 'class="normal"'; return '<a href="'.$site_url.'"'.$attributes.'>'.$title.'</a>'; } } 

Файл вида:

 <ul class="topnav love"> <li class="topnav-1"><?=menu_anchor(base_url()."path/to/something", "menu_item")?></li> <li class="topnav-2"><?=menu_anchor(base_url()."path/to/something", "menu_item")?></li> <li class="topnav-3"><?=menu_anchor(base_url()."path/to/something", "menu_item")?></li> <li class="topnav-4"><?=menu_anchor(base_url()."path/to/something", "menu_item")?></li> <li class="topnav-5"><?=menu_anchor(base_url()."path/to/something", "menu_item")?></li> </ul> 

Css:

ul.topnav li.topnav-1 a.active {что-то умное}

Я использую приведенный ниже код – ура!

 <?php echo ($this->uri->segment(1)=='dashboard' && $this->uri->segment(2)=='')? 'active' : ''; ?> 

Я видел из сделанного выше комментария, что, возможно, вы искали что-то немного более компактное. По умолчанию не существует такой функции в Codeigniter, но ее достаточно просто сделать. Это то, что я собрал сейчас, но это может быть то, что вы хотите иметь.

Сначала ознакомьтесь с помощником URL в руководстве. http://codeigniter.com/user_guide/helpers/url_helper.html

Посмотрите конкретно на функцию привязки и поймите, как ее использовать. У вас должно быть привычка использовать этот помощник, помощник HTML и помощник формы. Это улучшит ваши взгляды. Все помощники доступны для нас в системной папке. Я только что открыл помощник URL и скопировал якорный код, а затем создал свой собственный вспомогательный файл в вспомогательной папке в приложении. Вы можете больше узнать о создании собственных помощников и автозагрузке их в руководстве.

Затем я сделал несколько изменений. Окончательный результат выглядит следующим образом:

 if ( ! function_exists('menu_anchor')) { function menu_anchor($uri = '', $title = '', $attributes = '') { $title = (string) $title; if ( ! is_array($uri)) { $site_url = ( ! preg_match('!^\w+://! i', $uri)) ? site_url($uri) : $uri; } else { $site_url = site_url($uri); } if ($title == '') { $title = $site_url; } if ($attributes != '') { $attributes = _parse_attributes($attributes); } $attributes .= ($site_url == current_url()) ? ' selected' : ''; return '<a href="'.$site_url.'"'.$attributes.'>'.$title.'</a>'; } } 

Как вы можете видеть, это всего лишь однострочная модификация: $ attributes. = ($ Site_url == current_url ())? 'selected': '';

В принципе, если URL-адрес загруженной страницы соответствует файлу, к которому привязывается привязка, он добавляет выбранный класс. Если вы не хотите, чтобы выбранная ссылка связывалась в любом месте, вы можете легко исправить это, установив $ site_url на # или что-то еще.