2014-12-04 71 views
1

在我的網站上,我有一個導航欄,其中包含指向不同控制器的鏈接。 到目前爲止,我使用jquery來突出顯示當前頁面的鏈接,但不知怎的,事情變得更加複雜,並且它已經不夠了。symfony2樹枝:在右側頁面突出顯示導航欄的最佳實踐

所以我的問題是:在導航欄上突出顯示當前頁面鏈接的最佳做法是什麼? - 將鏈接的ID作爲參數傳遞給模板? - 更自動化的東西,不需要修改每個控制器的響應?

+2

最簡單的方法是將selected_pa​​ge_id(s)作爲全局變量傳遞給twig。這樣你不需要編輯你的控制器。 – DarkBee 2014-12-04 13:54:00

+1

我正在使用[KnpMenuBundle](http://knpbundles.com/KnpLabs/KnpMenuBundle),它爲我完成了這項工作。 – 2014-12-04 15:18:31

+0

@DarkBee:你能否詳細說明你是如何完成這項工作的?看起來很有趣 - Alain,這個包看起來不錯,但看起來不太容易定製。謝謝! – 2014-12-04 17:33:14

回答

1

假設您可以將當前頁面與數據庫中的ID進行匹配,並且您正在爲您的網站使用基本模板。我建議你可以做這樣的事情:

base.twig.html

{% import "somemacros.twig.html" as macros %} 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta http-equiv="x-ua-compatible" content="IE=Edge"/> 
     <title>{{ title | default('') }}</title> 

     <!-- ************** Metas ************** --> 
     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
    </head> 
    <body> 
      <div id="container"> 
       <div id="sidebar_left"> 
       <!-- Just to be lazy --> 
       {{ macros.menu(links) }} 
      </div> 
       <div id="content"> 
        {% block content %} 

        {% endblock %} 
       </div> 
    </body> 
</html> 

somemacros.twig.html

{% macro menu(links, class) %} 
    {% if not links is empty %} 
     {% for link in links %} 
      {% if link['selected'] is defined and link['selected'] %} 
       {% set is_selected = true %} 
      {% else %} 
       {% set is_selected = false %} 
      {% endif %} 
      <li{%if class != '' %} class="{{ class }}"{% endif %}> 
       <a href="{{ link.getRoute }}" {% if link.PageId in selected_page_ids or link.hasPublicChildren or is_selected %} class="{% if link.PageId in selected_page_ids or is_selected %}selected{% endif %} {%if link.hasPublicChildren%}dropdown{%endif%}"{% endif %}>{{ link.name }}</a> 
       {% if link.hasPublicChildren %} 
        <ul> 
         {{ _self.menu(link.getPublicChildren) }} 
        </ul> 
       {% endif %} 
      </li> 
     {% endfor %} 
    {% endif %} 
{% endmacro %} 

PHP邏輯

<?php 
    // ... 
    // register twig 
    // find out current page/page parents if u are using submenu's 
    // ... 

    $twig->addGlobal('selected_page_ids', $page_ids); //page_ids is an array of the selected page ids 
    // run symfony 

添加變量之後目前$page_id(或​​在我的情況下,因爲我有子菜單)作爲一個全球到twig你現在可以在任何地方訪問這個變量,即使在宏內部也是如此。正如你可以在我的菜單宏中看到的,我使用{% if link.PageId in selected_page_ids來添加我選擇的類。宏是因爲我很懶