2013-06-18 2 views
6

У меня есть проблема, похожая на этот вопроскак добавить активный класс в текущей странице в CakePHP

How to identify active menu link in CakePHP

У меня есть страница в моем файле default.ctp, в котором я хочу, чтобы добавить «активный» класс по ссылкам. Как я могу определить текущий 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 class = 'active''> 
+0

возможно дубликат [Как определить активную ссылку меню в CakePHP] (http://stackoverflow.com/questions/11717422/how-to-identify-active-menu-link-in-cakephp) – bfncs

ответ

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

thankkkkkkkkkkkkkkkkkkkkk вы это действительно работаете ... thankuu budyy .god благослови вас – hellosheikh

+0

COOL .. welcome – AnNaMaLaI

7

Если у вас есть другой контроллер и вы объявили метод с таким же именем, и приведенный выше код не работает, то вы можете сделать следующее:

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

Здесь вид метод заявлено в другом контроллере. Я надеюсь, что это будет полезно для вас.

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

Я ищу более чистый путь к этому, как ваш пример. Но как бы вы это сделали, если у вас разные контроллеры, и у всех из них есть действия с тем же именем? – eve

+0

@eve Я думаю, это зависит от того, сколько у вас страниц. У меня только несколько. Но если у вас есть разные контроллеры и действия, возможно, вы можете сделать его многомерным массивом. Я уточню свой ответ, чтобы показать. – TemiGiwa

+0

Большое спасибо за редактирование !! – eve