如何识别CakePHP的活动菜单链接(How to identify active menu lin

2019-06-26 14:48发布

我创建一个管理员栏手风琴布局。 现在我需要找出有效的链接,并添加一个类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>

做这个的最好方式是什么? 提前致谢!

Answer 1:

我已经找到了解决办法:

$url = $this->Html->url('INPUT_THE_URL') ;
$active = $this->request->here == $url? true: false;


Answer 2:

要检查一个给定的URL是否是目前在CakePHP的2.x的活跃,你应该检查它是否归(在意义上的路由器::正常化() )的形式是一样的当前请求的URL的规范化格式(在这个意义上的$this->request->here )。

$currentUrl = Router::normalize($this->request->here);
$checkedUrl = Router::normalize($myUrl);
$isActive = $currentUrl === $checkedUrl;

有时你可能需要一个宽松的匹配显示网页作为活跃在菜单中,如果当前显示一个孩子。 想你想显示你的菜单链接到水果概述网站/fruits/活性,而在网上冲浪的香蕉细节网站/fruits/banana/ 。 您可以通过查找仅部分匹配容易实现这一点。

$isActive = (0 === strpos($currentUrl, $checkedUrl));

为了确保您的匹配可能会变得越来越复杂,例如,如果你在很大程度上利用名为PARAMS的等,并且要反映它在你的菜单,但你应该从这里找到自己的方式。

a。对于特定问题的解决方案可能是这样的:

$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 /蛋糕menu_builder 。



Answer 3:

有许多方法,这里有几个用于添加类容器

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


Answer 4:

这里简单的方式来增加活动类:

<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>

我认为你这会有所帮助。



Answer 5:

我知道这是很老,但我发现了一个很好的解决方案。

基于费萨尔的回答,我写我自己的简单助手:

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'));


文章来源: How to identify active menu link in CakePHP