如何在CakePhp中为当前页面添加活动类

6

我有一个类似于这个问题的问题。

如何在CakePHP中识别活动菜单链接

我在default.ctp文件中有一个页面,我想在链接上添加'active'类。我如何识别当前页面的URL,然后在链接上应用该类。我已经按照那里的答案进行了操作,答案是:

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

我不知道该如何在我的代码中实现这个功能。非常抱歉向您提问,因为我是一个 CakePHP 新手。以下是我的代码:

 **default.ctp file** 

 <li>
      <?php echo $this->Html->link('Dashboard', array('controller'=>'users','action' => 'controlpanel'), array('title' => 'Dashboard','class' => 'shortcut-dashboard'));?></li>



  <li> <?php echo $this->Html->link('Contacts', array('controller'=>'contacts','action' => 'index'), array('title' => 'Contacts','class' => 'shortcut-contacts'));?></li>

我想给像这样的li元素添加一个类:
   <li class = 'active''>

可能是如何在CakePHP中识别活动菜单链接的重复问题。 - bfncs
3个回答

12

这是一个简单的逻辑,如下所示

<li class="<?php echo (!empty($this->params['action']) && ($this->params['action']=='controlpanel') )?'active' :'inactive' ?>">
  <?php echo $this->Html->link('Dashboard', array('controller'=>'users','action' => 'controlpanel'), array('title' => 'Dashboard','class' => 'shortcut-dashboard'));?>
</li>

<li class="<?php echo (!empty($this->params['action']) && ($this->params['action']=='index') )?'active' :'inactive' ?>">
  <?php echo $this->Html->link('Contacts', array('controller'=>'contacts','action' => 'index'), array('title' => 'Contacts','class' => 'shortcut-contacts'));?></li>

非常感谢,它真的有效...谢谢你,伙计。愿上帝保佑你。 - hellosheikh

8

如果您有一个不同的控制器,并且您已经声明了一个相同名称的方法,而上述代码不起作用,则可以执行以下操作:

<li class="<?php echo (($this->params['controller']==='hotels')&& ($this->params['action']=='view') )?'active' :'' ?>" >
   <?php echo $this->Html->link('Hotels', array('controller' => 'hotels', 'action' => 'view')); ?>
</li>

<li class="<?php echo (($this->params['controller']==='packages')&& ($this->params['action']=='view') )?'active' :'' ?>" >
   <?php echo $this->Html->link('Packages', array('controller' => 'packages', 'action' => 'view')); ?>
</li>

这里的view方法是在不同的控制器中声明的。希望对您有所帮助。


1
不是为了重新激活一个已经过时的帖子,但这就是我所做的(我相信这更加简洁、快速和易于管理)。
我创建一个具有页面数组的元素,然后检查数组中的每个项目,以查看它是否为当前页面。如果是,则添加活动类。
然后我可以从任何地方调用此元素。
// Changed the line below to a multi-dimensional array to cater for different controllers and actions

//$mypages = array('Home','About','Pricing','FAQs','Contact');
$mypages = array(
 array('controller'=>'controller1','action'=>'action1','name'=>'name1'),
 array('controller'=>'controller2','action'=>'action2','name'=>'name2
')
);
foreach ($mypages as $page ){
// Changed to account for controller and action
//$currentPage = isset($this->params['pass'][0]) ?$this->params['pass'][0] : "";
$controller = isset($this->request->params['controller'])?$this->request->params['controller']: "";
$action= isset($this->request->params['action'])?$this->request->params['action']: "";

    if (strtolower($page['controller']) == $controller && strtolower($page['action']) == $action) {  
        echo "<li class='active'>" . $this->Html->link($page,array("controller"=>"pages", "action"=>strtolower($page))) . "</li>" ;  
    } 
    else  {
        echo "<li>" . $this->Html->link($page,array("controller"=>"pages", "action"=>strtolower($page)))  . "</li>"; 
    }
}

我正在寻找一种像你的例子一样更清晰的方法来做这件事。但是如果你有不同的控制器,而且它们都有相同名称的操作,那你会怎么做呢? - eve
@eve 我猜这取决于你有多少页面。我只有几个。但如果你有不同的控制器和操作,你可能可以将其制作成多维数组。我会更新我的答案来展示。 - TemiGiwa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接