2012-07-30 28 views
9

我正在爲管理員側邊欄創建摺疊式佈局。現在我需要確定活動鏈接,並向該鏈接添加一個類active。這是我的代碼:如何識別CakePHP中的活動菜單鏈接

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

這樣做的最好方法是什麼?提前致謝!

回答

5

我已經找到了解決辦法:

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

downvote,因爲'here()'包含所有命名參數和查詢字符串。 – mrdaliri 2014-11-10 08:24:00

+0

這個'$ this-> request-> here'中的URL不一定與路由器生成的URL相同,即使它應該是。在比較之前,你應該使用['Router :: normalize()](http://api.cakephp.org/2.6/class-Router.html#_normalize)來標準化你的URL。 – bfncs 2015-02-19 21:00:34

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

通過這種方法我已經把條件開/每一個環節之前,如果任何幫助或其他任何方法,通過它我可以做動態 – Krishna 2012-07-30 08:55:17

+2

@Krishna這通常是你有辦法不幸的是,如果你有一個一致的佈局,你可以創建你自己的助手類。 – Dunhamzzz 2012-07-30 09:11:16

+0

您可以使用現有的助手等。嘗試谷歌爲他們或搜索cakephp插件網站。 – mark 2012-07-30 09:33:48

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> 

我認爲這對你有幫助。

+0

這種方法在使用[前綴路由](http://book.cakephp.org/2.0/en/development/routing.html#prefix-routing)和[插件路由](http:// book.cakephp.org/2.0/en/development/routing.html#plugin-routing)以及使用其他網址請求內容而不是規範內容時的錯誤否定。它也是非常詳細和un [DRY](http://de.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself)。更好的方法是使用['Router :: normalize()'](http://api.cakephp.org/2.6/class-Router.html#_normalize)在規範化後檢查匹配的URL。 – bfncs 2015-02-19 21:08:19

3

要檢查給定的URL當前是否在Cakephp 2.x中處於活動狀態,您應該檢查它是否規範化(在Router::normalize()意義上)form與當前請求的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的等,並且要反映它在你的菜單,但你應該從這裏找到自己的方式。

用於您的特定問題的解決方案可能是這樣的:

$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

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

謝謝,這幫了我很多! =)我使用CakePHP 3.1.5。所以對於任何讀這個的人來說,3.x的語法必須是:'$ this-> request-> params ['action']'。在文件的開頭有一些不同之處。參見:[CakePHP-3-Creating-Helpers](http://book.cakephp.org/3.0/en/views/helpers.html#creating-helpers) – eve 2016-01-23 19:17:48