CodeIgniter中的当前URI段

时间:2010-09-09 03:13:30

标签: php codeigniter

在CodeIgniter视图中检查当前URI段的最佳方法是什么?我想要做的是使用当前的URI段[即$ this-> uri-> segment(1)],以突出显示导航栏上的当前页面。

我想到的最好的事情就是

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

在我的每个控制器中,然后在header.php文件中,我检查$ current_uri变量以确定应该突出显示导航的哪个部分。如你所知,这是一种非常繁琐的方式,但是我无法做到这一点。

甚至可以扩展默认的Controller类来传递当前的URI段,但我不确定这是否可行,或者甚至不知道如何去做。

6 个答案:

答案 0 :(得分:6)

我自己使用类似于anchor()的额外函数。我将其称为active_anchor(),它采用所有相同的参数加上另一个(uri)。如果传递的uri字符串与active_anchor()url参数匹配,则该函数会将类添加为“active”。

然后函数使用锚函数返回(函数所做的就是确定链接是否需要类'活动'。

修改

我只是把这段代码放在一个名为'MY_url_helper.php'的文件中。这样,当加载url帮助器时(我实际上是自动加载那个,因为我的几乎所有视图都使用它。)这只是一些快速代码,非常确定它会起作用。基本上它采用与anchor()函数相同的参数,但也使用$ key变量。如果密钥和网址匹配,它会向锚标记附加一个“活动”类。

<?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);
    }
}

答案 1 :(得分:2)

当我在Cakephp中构建一个客户网站时,我也遇到了同样的问题,将每个菜单项的字符串从控制器传递到视图,然后再次检查以实现突出显示,至少可以说乏味。

对于我的一些项目,我一直在实现相同的目的,将每个导航菜单页面的页面信息存储在数据库中,如页面名称,网址,标题,导航菜单中的位置等。

然后在控制器的开头,我将所有这些数据存储在一个数组中,说$pageinfo

我通过一个控制器处理导航功能,该控制器检查URI段并根据该段加载内容。

生成视图时,突出显示部分留给if语句,我将每个页面名称与我在$pageinfo中转储的信息进行比较。

像这样......

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

这样我就不需要将字符串常量(在你的情况下为uri段)传递给视图。这种CMS有点方法允许我灵活地在我的菜单中添加更多项目,而无需添加更多代码。

我记得从codeigniter wiki获取此信息,现在无法找到它的链接。

答案 2 :(得分: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)表示你的控制器中的功能。

但是有一个弱点,如果我把视图放在索引控制器中我会遇到麻烦,所以我不使用函数索引(uri段中的toruble,同时制作2个当前页面...阅读此http://ellislab.com/codeigniter/user-guide/libraries/uri.html

答案 3 :(得分: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>

答案 4 :(得分:0)

我可能会因为提出客户端方法而受到抨击,但这是我过去用来标记当前页面突出显示的内容:

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

答案 5 :(得分: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计算信息(这不仅效率低,而且反复编写也很麻烦。)< / p>