2012-07-30 38 views
9

Tôi đang tạo bố cục accordion cho thanh bên quản trị. Bây giờ tôi cần xác định liên kết đang hoạt động và thêm một lớp học active vào liên kết đó. Đây là mã của tôi:Cách xác định liên kết menu hoạt động trong 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> 

Cách tốt nhất để làm điều này là gì? Cảm ơn trước!

Trả lời

5

tôi đã tìm thấy các giải pháp:

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

downvote, vì 'ở đây()' bao gồm tất cả các tham số có tên và chuỗi truy vấn. – mrdaliri

+0

URL trong '$ this-> request-> here' này không nhất thiết phải giống với URL được tạo bởi router, ngay cả khi nó được. Bạn nên chuẩn hóa các URL của mình với ['Router :: normalize()] (http://api.cakephp.org/2.6/class-Router.html#_normalize) trước khi so sánh chúng. – bfncs

2

Có một số cách khác nhau, dưới đây là một vài để thêm lớp để 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"' : ''?>> 

Hoặc bạn có thể vượt qua nó vào $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

Bằng phương pháp này, tôi có phải đặt điều kiện trên/trước mỗi liên kết, nếu có helper hoặc bất kỳ phương pháp khác mà tôi có thể làm điều đó tự động – Krishna

+2

@Krishna này thường là cách bạn có để làm điều đó trong PHP không may, bạn có thể tạo lớp trợ giúp của riêng bạn nếu bạn có bố cục nhất quán. – Dunhamzzz

+0

có những người trợ giúp hiện tại, bạn có thể sử dụng. hãy thử google cho họ hoặc tìm kiếm trang web plugin của trang web. – mark

1

Đây là cách đơn giản để thêm lớp đang hoạt động:

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

Tôi nghĩ điều này sẽ hữu ích cho bạn.

+0

Cách tiếp cận này sẽ dẫn đến các kết quả sai khi sử dụng [định tuyến tiền tố] (http://book.cakephp.org/2.0/en/development/routing.html#prefix-routing) và [định tuyến plugin] (http: // book.cakephp.org/2.0/en/development/routing.html#plugin-routing) cũng như các từ khóa phủ định sai khi bạn yêu cầu nội dung với các URL khác so với các URL chuẩn. Ngoài ra nó là rất tiết và un [DRY] (http://de.wikipedia.org/wiki/Don%E2%80%99t_repeat_yourself). Một cách tiếp cận tốt hơn sẽ kiểm tra các URL phù hợp sau khi bình thường hóa với ['Router :: normalize()'] (http://api.cakephp.org/2.6/class-Router.html#_normalize). – bfncs

3

Để kiểm tra xem một URL cụ thể hiện có đang hoạt động trong Cakephp 2.x hay không, bạn nên kiểm tra xem biểu mẫu có được chuẩn hóa (theo nghĩa là Router::normalize()) giống với biểu mẫu chuẩn của URL hiện được yêu cầu hay không (theo nghĩa $this->request->here).

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

Đôi khi bạn có thể muốn đối sánh rộng để hiển thị trang đang hoạt động trong menu, nếu một đứa trẻ hiện được hiển thị. Hãy nghĩ rằng bạn muốn hiển thị liên kết trình đơn của bạn đến trang tổng quan về trái cây tại /fruits/ khi hoạt động trong khi lướt trang web chi tiết chuối tại /fruits/banana/. Bạn có thể đạt được điều này một cách dễ dàng bằng cách chỉ tìm kiếm một phần phù hợp.

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

Để chắc chắn kết hợp của bạn có thể trở nên phức tạp hơn, ví dụ như bạn đang sử dụng các thông số được đặt tên và tương tự và muốn phản ánh nó trong menu của bạn, nhưng bạn nên tìm đường từ đây.

Một giải pháp cho vấn đề cụ thể của bạn có thể trông như thế này:

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

Để làm live chút chỉ là nhỏ bé của bạn dễ dàng hơn bằng thậm chí không suy nghĩ về câu hỏi này, bạn cũng có thể sử dụng một Helper để tạo menu một ai đó khác được xây dựng như torifat/cake-menu_builder.

1

Tôi biết điều này khá cũ nhưng tôi đã tìm thấy một giải pháp tốt.

Dựa trên câu trả lời Faisal của tôi đã viết Helper đơn giản của riêng tôi:

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

} 

Có lẽ bạn cần phải sửa đổi echo <li> bên trong hàm để phù hợp với nhu cầu của bạn.

Ví dụ:

echo $this->PVHtml->link('Login', array('controller' => 'users', 'action' => 'login')); 
+0

Cảm ơn, điều đó đã giúp tôi rất nhiều! =) Tôi sử dụng CakePHP 3.1.5. Vì vậy, đối với bất cứ ai đọc điều này, cú pháp cho 3.x phải là: '$ this-> request-> params ['action']'. Và một số khác biệt ở đầu tệp. Xem: [Cakephp-3-Creating-Helpers] (http://book.cakephp.org/3.0/en/views/helpers.html#creating-helpers) – eve

Các vấn đề liên quan