2013-04-09 42 views
2

我正在創建一個網站並已成功獲取我的導航菜單使用存儲在數據庫中的樹結構工作。在Symfony2中構建麪包屑

一個Menu對象爲active屬性,但我不知道如何去了解它設置爲活動!如果我能做到這一點,那麼我可以獲得當前活動的Menu的路徑,並使用WhiteOctober的BreadcrumbsBundle或類似的東西渲染麪包屑。

我已經閱讀了很多關於SO的問題,並且還查看了可用的不同捆綁包,但我仍然停留在如何執行此操作。

我該如何去找出菜單項設置爲活動?

編輯:

編輯2:

好吧,我幾乎做到了。我設法比較了當前路徑,使用$this->container->get('request')->getPathInfo();Menu的集合url

爲此,我需要將菜單樹結構展平成一個數組。當我使用DoctrineExtensions的樹擴展時,我使用其存儲庫的getChildren($node)來執行此操作。所以現在迭代數組很容易,可以比較url和路徑。

在麪包屑控制器中,我可以通過菜單控制器中的$current_item,並再次使用Tree存儲庫及其遞歸獲取給定節點的父母的方法(getPath())。

但是,仍然存在問題,因爲網站上的某些頁面沒有菜單項。因此,例如,如果我訪問site.com/news/tags/stuff,它沒有菜單條目,因此打破了網站。

到目前爲止:

+0

你想要在你的樹枝模板或控制器中的當前活動頁面?你能向我們展示你的菜單嗎? (我猜它不僅有一個'active'屬性) – cheesemacfly

+0

你是對的,它不只是擁有那個屬性。該文件超過400行,因此我在問題中添加了一個鏈接。菜單的樹形結構工作正常,這就是爲什麼我添加了「active」屬性,因此我可以將相關的「Menu」項目設置爲活動項目。我只是不知道如何找出當前的項目! – Robin

+0

我想你將不得不比較'Menu'對象的'$ url'屬性與當前路徑。你有一個代碼小例子,展示瞭如何在你的控制器/樹枝模板中使用這個'Menu'對象? – cheesemacfly

回答

3

我終於它雖然有很多更多的代碼比我想象的還要服用。

在我的頭模板中,我調用了一些自定義的Twig擴展來渲染主菜單。在菜單控制器中,setCurrentMenuItemAction在呈現菜單期間被調用以找出當前菜單項目。當前的菜單項需要知道,以便可以創建麪包屑。從本質上說,這種方法試圖匹配當前URL路徑(在主菜單中使用getPathInfo()到菜單網址。

容易的部分是通過剛好在比較URL和菜單的URL找到一個精確匹配(我選擇不處理多個完全匹配)

如果找不到完全匹配,即url與任何菜單都不匹配,那麼它需要猜測要設置爲當前項目的內容。首先,當前的URL路徑和菜單路徑分解,然後我用一個for循環來比較每個數組的值:

$count = count($url_parts); 
//echo $count; 
$intersects = 0; 
for($i = 0; $i < $count; $i++){ 
     if(array_key_exists($i, $child_parts)){ 
     if($child_parts[$i] == $url_parts[$i]){ 
      //echo $child_parts[$i]; 
      $intersects++; 
     } 
    } 
} 
return $intersects; 

返回值被用於計算哪一個菜單項應該是所選擇的一個。這給出了與array_intersect類似的結果。與array_intersect的問題是,它會比較陣列而不管該值在順序舉例來說,假設當前的URL爲/news/tag/sports,這給的交集值:

菜單項URL:

  1. /新聞相交:1
  2. /消息/一般相交:1
  3. /新聞/運動相交:2

因此,使用array_intersect,網址/news/tag/sports將導致/news/sports是所選菜單。所需的選擇菜單項將是/news,這就是爲什麼我不得不溝通array_intersect

由於上面的菜單#1和#2具有相交值1,因此只需找到具有最少項目的菜單展開陣列即可得到所需的菜單。

最後,如果仍然沒有匹配:url和任何菜單項之間沒有相似性,那麼必須創建一個臨時菜單。我想創建一個Menu的實例來做到這一點,但遇到了與MenuRepository一起使用這個問題(我認爲它需要一個菜單​​需要存儲在數據庫),所以我剛剛創建了一個數組與當前的網址和end()該網址作爲名稱。稍微凌亂 - 可能需要改進。

+0

很高興找到解決方案!關於'array_intersect '你有問題,你能不能使用['array_intersect_assoc'](http://www.php.net/manual/en/function.array-intersect-assoc.php)? – cheesemacfly