在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段,但我不确定这是否可行,或者甚至不知道如何去做。
答案 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>