Текущий сегмент URI в CodeIgniter - PullRequest
       0

Текущий сегмент URI в CodeIgniter

9 голосов
/ 09 сентября 2010

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

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

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

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

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

Ответы [ 6 ]

6 голосов
/ 09 сентября 2010

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

Затем функция возвращается с помощью функции привязки (все, что сделала функция, это определило, нужен ли ссылке класс«Активен» или нет.

РЕДАКТИРОВАТЬ:

Я просто поместил этот код в файл с именем '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);
    }
}
2 голосов
/ 29 июля 2014
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>
2 голосов
/ 24 мая 2013

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

<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), означающий функцию в вашем контроллере.

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

2 голосов
/ 09 сентября 2010

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

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

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

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

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

Как то так ...

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

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

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

0 голосов
/ 25 мая 2013

В каждом проекте 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 рассчитать информацию (которая не только неэффективна, но и громоздка для записи снова и снова).

0 голосов
/ 10 сентября 2010

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

var path = location.pathname.substring(1);
if ( path )
 $('#navigation a[href$="' + path + '"]').parents('li').attr('class', 'current');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...