2010-09-09 2 views
8

Что было бы лучшим способом проверить текущий сегмент URI в представлении CodeIgniter? То, что я пытаюсь сделать, - использовать текущий сегмент URI (т. $ this-> uri-> segment (1)], чтобы выделить текущую страницу на панели навигации.Текущий сегмент URI в CodeIgniter

Самое лучшее, что я понял, это сделать

$data['current_uri'] = $this->uri->segment(1); 
$this->load->view('header', $data); 

в каждом из моих контроллеров, а затем в файле header.php, проверить переменную $ current_uri, чтобы определить, какая часть навигации должна быть подсвечен. Как вы знаете, это очень утомительный способ сделать это, но я теряю лучший способ сделать это.

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

+1

Я делал то же самое, и мне очень интересно узнать о лучшем решении. – janosrusiczki

ответ

6

Я сам использую дополнительную функцию, аналогичную функции anchor(). Я называю его active_anchor(), и он принимает все те же параметры плюс другой (uri). Затем функция добавляет класс 'active', если строка uri прошла совпадение с параметром url active_anchor().

функция возвращает, используя функцию якоря (все, что функция действительно была определить, если ссылка необходима класс «активный» или не

EDIT:.

Я просто поместить этот код в файл под названием «MY_url_helper.php». Таким образом, когда загружается помощник URL (я фактически загружаю этот файл, так как почти все мои взгляды используют его в любом случае.) Это просто быстрый код тоже, он уверен, что он будет работать В основном он принимает те же аргументы, что и функция anchor(), но также и ключевая переменная $. Он добавляет класс «active» к тегу привязки, если ключ и URL совпадают.

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

if (! function_exists('active_anchor')) 
{ 
    function active_anchor($url = NULL, $title = NULL, $key = NULL, $params = array()) 
    { 
     if ($url && $key) 
     { 
      if($key == $url) 
      { 
       if (array_key_exists ('class' , $params)) 
       { 
        $params['class'] .= ' active'; 
       } 
       else 
       { 
        $params['class'] = 'active'; 
       } 
      } 
     } 
     return anchor($url, $title, $params); 
    } 
} 
+0

Мне нравится этот подход. Где бы я поставил эту функцию? Я предполагаю, что мне нужно расширить один из классов CI, но я не уверен, какой? – Jared

2

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

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

Затем в начале контроллера я сохраняю все эти данные в массиве, скажем $pageinfo.

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

Элемент подсветки остается в выражении if при создании представления, где я сравниваю каждое имя страницы с информацией, которую я сбросил в $pageinfo.

Что-то вроде этого ...

foreach ($navi_menu as $links) { 
    if ($links['title'] == $pageinfo['title']) { 
     // Highlight here 
    } 
    else { 
     // No highlight 
    } 
} 

Таким образом, мне не нужно, чтобы передать строковые константы (Uri сегменты в вашем случае) к виду. Такой подход CMS-типа позволяет мне гибко добавлять новые элементы в мое меню, не добавляя больше кода.

Я помню, как получить это из вики-кода, не могу найти ссылку на него прямо сейчас.

0

Я, вероятно, получите пылали, предложившего на стороне клиента подход, но это то, что я использовал в прошлом, чтобы пометить текущую страницу как подчеркивается:

var path = location.pathname.substring(1); 
if (path) 
$('#navigation a[href$="' + path + '"]').parents('li').attr('class', 'current'); 
+0

Вы знали, что это неправильный подход, но вы все равно его рекомендовали? –

2

это простой способ и работает хорошо для меня ..

<li class="<?=($this->uri->segment(2)==='test')?'current-menu-item':''?>"><?php echo  anchor ('home/index','HOME'); ?></li> 

<li class="<?=($this->uri->segment(2)==='blog')?'current-menu-item':''?>"><?php echo  anchor ('home/blog','BLOG'); ?></li> 
<li class="<?=($this->uri->segment(2)==='bla..bla')?'current-menu-item':''?>"><?php  echo anchor ('home/blog','bla..bla'); ?></li> 

uri_segment (2), что означает функцию в контроллере ур.

но есть слабость, у меня есть проблемы, если я поставил точку зрения контроллера индекса, поэтому им не использовать индекс функции (toruble в Ури сегменте, сделать 2 текущую страницу в то же время ... читать эту http://ellislab.com/codeigniter/user-guide/libraries/uri.html

+0

Если у вас есть контроллеры, организованные в папках, то uri_segment (2) больше не будет функцией контроллера. –

0

В в каждом проекте CodeIgniter я собираю некоторую базовую информацию о запросе в MY_Controller.

Я расширяю контроллер ядра и вставляю логику инициализации, которая должна выполняться на каждой странице. Сюда входит получение информации о контроллере и методе, который В качестве краткого примера:

class MY_Controller extends CI_Controller 
{ 
    protected $_response_type = 'html'; 
    protected $_secure; 
    protected $_dir; 
    protected $_controller; 
    protected $_method; 
    protected $_template; 
    protected $_view; 
    protected $_user; 

    public function __construct() 
    { 
     parent::__construct(); 

     // Gather info about the request 
     $this->_secure = ! empty($_SERVER['HTTPS']); 
     $this->_dir = $this->router->fetch_directory(); 
     $this->_controller = $this->router->fetch_class(); 
     $this->_method = $this->router->fetch_method(); 

     // set the default template and view 
     $this->_template = 'default'; 
     $this->_view = $this->_dir . $this->_controller . '/' . $this->_method; 
    } 

    /** 
    * Performs operations right before data is displayed. 
    * 
    * @access public 
    * @return void 
    */ 
    public function _pre_display() 
    { 
     if ($this->_response_type === 'html') { 
      $this->load->vars(array(
       'user' => $this->_user 
      )); 
     } 
     elseif ($this->_response_type === 'json') { 
      $this->_template = 'json'; 
      $this->_view = NULL; 
     } 
     else { 
      show_error('Invalid response type.'); 
     } 

     $this->load->vars(array(
      'is_secure' => $this->_secure, 
      'controller' => $this->_controller, 
      'method' => $this->_method 
     )); 
    } 
} 

В настоящее время в целях, таких как навигация, вы можете использовать эту информацию, как это:

<a href="<?php echo site_url('products') ?>"<?php echo ($controller === 'products') ? ' class="selected"' : ''; ?>>Products</a> 

мне нравится это, потому что с маршрутами или переписывает, вы можете получить доступ к контроллерам и методы из разных URL. Таким образом вы определяете, активна ли ссылка на основе контроллера/метода, обслуживающего контент, а не на основе URL-адреса.

Кроме того, эта информация может быть повторно использована в ваших контроллерах или представлениях по любой причине, и вы не постоянно просите маршрутизатор или uri рассчитать информацию (которая не только неэффективна, но и громоздка для записи снова и снова).

1
Simple way to check the uri segment in view, 

Add some code if matches found. 
<li class="<?php echo (strcmp($this->uri->segment(2),'test')==0)?'active':''; ?>"><li> 
<li class="<?php echo (strcmp($this->uri->segment(2),'test1')==0)?'active':''; ?>"><li> 
<li class="<?php echo (strcmp($this->uri->segment(2),'test2')==0)?'active':''; ?>"><li> 
Смежные вопросы