我正在为管理侧栏创建一个手风琴布局。现在我需要识别活动链接并向该链接添加一个类active
。这是我的代码:
<div class="accordion-group">
<div class="accordion-heading">
<a href="#collapseSeven" data-parent="#side_accordion" data-toggle="collapse" class="accordion-toggle">
<i class="icon-th"></i> Gallery Manager
</a>
</div>
<div class="accordion-body collapse" id="collapseSeven">
<div class="accordion-inner">
<ul class="nav nav-list">
<li>
<?php echo $this->Html->link('View All',array('controller' => 'gallaries', 'action' => 'index'));?>
</li>
<li>
<?php echo $this->Html->link('Add New',array('controller' => 'gallaries', 'action' => 'add'));?>
</li>
</ul>
</div>
</div>
</div>
最好的方法是什么?提前谢谢!
答案 0 :(得分:5)
我找到了解决方案:
$url = $this->Html->url('INPUT_THE_URL') ;
$active = $this->request->here == $url? true: false;
答案 1 :(得分:3)
要检查给定的URL当前是否在Cakephp 2.x中处于活动状态,您应检查它是否已规范化(在Router::normalize())意义上与当前请求的URL的规范化形式相同(在感觉$this->request->here
)。
$currentUrl = Router::normalize($this->request->here);
$checkedUrl = Router::normalize($myUrl);
$isActive = $currentUrl === $checkedUrl;
如果当前显示了某个孩子,有时您可能需要一个松散匹配才能将菜单显示为菜单中的活动状态。您想要在/fruits/
浏览Banana详细信息网站时显示您在/fruits/banana/
水果概览网站的菜单链接。您可以通过仅查找部分匹配来轻松实现此目的。
$isActive = (0 === strpos($currentUrl, $checkedUrl));
确保您的匹配可能会变得更复杂,例如,如果您大量使用命名参数等,并希望在菜单中反映它,但您应该从这里找到方法。
针对您的特定问题的解决方案可能如下所示:
$currentUrl = Router::normalize($this->request->here);
$links = array(
array(
'label' => __('View All'),
'url' => array('controller' => 'galleries', 'action' => 'index'),
),
array(
'label' => __('Add New'),
'url' => array('controller' => 'galleries', 'action' => 'add'),
),
/* ... */
);
foreach ($links as $link) {
$linkLabel = $link['label'];
$linkUrl = Router::url($link['url']);
$linkHtml = $this->Html->link($linkLabel, $linkUrl);
$linkActive = $currentUrl === $linkUrl;
echo $this->Html->tag('li', $linkHtml, array(
'class' => $linkActive ? 'active' : '',
'escape' => false, // to not escape anchor markup
));
}
为了让你的生活更轻松,甚至不考虑这个问题,你也可以使用帮助器创建其他人建造的菜单,如torifat/cake-menu_builder。
答案 2 :(得分:2)
有很多方法,这里有一些用于将类添加到容器
的方法<li <?php echo ($url == 'users/account')? 'class="current"' : ''?>>
<li <?php echo (preg_match("/addresses/", $url))? 'class="current"' : ''?>>
<li <?php echo ($this->params['controller'] == 'attributes')? 'class="current"' : ''?>>
或者您可以将其传递到$options
$options = array();
if($this->controller == 'mycontroller' && $this->action == 'myaction'){
$options = array_merge($options, array('class'=>'active'));
}
echo $this->Html->link('Title', '/url', $options);
答案 3 :(得分:1)
这里添加活动类的简单方法:
<ul class="nav nav-list">
<li class="<?php echo (($this->params['controller']==='gallaries')&&($this->params['action']=='index') )?'active' :'' ?>">
<?php echo $this->Html->link('View All',array('controller' => 'gallaries', 'action' => 'index'));?>
</li>
<li class="<?php echo (($this->params['controller']==='gallaries')&& ($this->params['action']=='add') )?'active' :'' ?>">
<?php echo $this->Html->link('Add New',array('controller' => 'gallaries', 'action' => 'add'));?>
</li>
</ul>
我认为这对你有帮助。
答案 4 :(得分:1)
我知道这已经很老了,但我找到了一个很好的解决方案。
根据费萨尔的回答,我写了自己的简单助手:
App::uses('AppHelper', 'View/AppHelper');
class PVHtmlHelper extends AppHelper {
public $helpers = array('Html');
public function link($title = null, $url = null, $options) {
if ($title == null || $url == null)
return;
$class = (($this->params['controller']===$url['controller']) && ($this->params['action']==$url['action']) )?'active' :'';
echo "<li class='" . $class . "'>" . $this->Html->link($title, $url, $options) . "</li>";
}
}
也许您需要修改函数内的echo <li>
以满足您的需求。
示例:
echo $this->PVHtml->link('Login', array('controller' => 'users', 'action' => 'login'));