How to identify active menu link in CakePHP

爱⌒轻易说出口 提交于 2019-12-01 03:34:27

I have found the solution :

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

To check whether a given URL is currently active in Cakephp 2.x, you should check if it's normalized (in the sense of Router::normalize()) form is the same as the normalized form of the currently requested URL (in the sense of $this->request->here).

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

Sometimes you might want a loose matching to show a page as active in a menu, if a child is currently shown. Think you want to display your menu link to the fruits overview site at /fruits/ as active while surfing the Banana detail site at /fruits/banana/. You can achieve this easily by looking for a partial match only.

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

For sure your matching might get more complex, for example if you're heavily making use of named params and the like and want to reflect it in your menu, but you should find your way from here.

A solution for your particular problem might look like this:

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

To make your live just that tiny bit easier by not even thinking about this question, you could also use a Helper for menu creation that someone else built like torifat/cake-menu_builder.

There are a number of ways, here are a few for adding the class to the container

<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"' : ''?>>

Or you can pass it into the $options

$options = array();
if($this->controller == 'mycontroller' && $this->action == 'myaction'){
  $options = array_merge($options, array('class'=>'active'));
}
echo $this->Html->link('Title', '/url', $options);
Faisal

Here simple way to add active class:

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

I think this will helpful for you.

I know this is pretty old but i found a good solution.

Based on Faisal's answer i wrote my own simple Helper:

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>";
    }

}

Maybe you need to modify the echo <li> inside the function to fit your needs.

Example:

echo $this->PVHtml->link('Login', array('controller' => 'users', 'action' => 'login'));
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!