2009-03-05 45 views
9

我想在每個從數據庫運行的頁面上顯示一個菜單。使用只是下來和骯髒的PHP這很容易,但我想要使用他們的MVC系統與cakephp整合。 現在我的問題是如何去做這件事的最好方法?在CakePHP中創建動態數據庫驅動菜單的最佳方式是什麼?

我的想法是爲佈局創建一個元素,然後爲所有邏輯創建一個組件或控制器。對此有何建議?或者是我想用的幫手?

我還需要從數據庫中的多個表中獲取所有數據。是否最好通過一個模型來完成我所有的數據收集邏輯?或者在菜單控制器(或組件)中執行大部分操作,併爲每個表使用模型?

謝謝

沃爾特

回答

7

模型應該獲取並從表中數據的過程,他們modelising,所以在該模型中每個模型獲取菜單數據。

組件旨在容納由多個控制器共享的邏輯,因此所有控制器都使用的菜單組件聽起來像是一個放置代碼以從模型中獲取菜單數據並將它們混合在一起的好地方。

菜單通常是一個嵌套列表,如果菜單也是這種情況,爲此輸出標記最簡單的方法是遞歸函數(一個調用自身的函數),一次輸出一個級別,所以不是一個元素,我只是在那裏創建一個帶有menu()方法的幫助器,然後直接從佈局調用它。

4

我同意neilcrooks的答案,但想澄清一些事情。

幫助者和元素非常簡單,除了幫助者可以更健壯一些(至少,這是我想'em'))。因此,如果您使用助手,可以即時綁定和取消綁定模型關聯 - 這將允許您從(臨時)關聯模型中獲取數據。個人而言,我喜歡胖模特和瘦身控制器,所以我認爲如果我處於這種情況,我會使用助手並暫時將模型綁定到它上面。我需要從現有模型中獲取的任何數據都將通過Model1-> fetchMenuPart(...)類型調用來訪問。

然後你可以從佈局文件中調用你的幫助器。

0

我想你會使用創建一個元素,將保存菜單的HTML,然後在您的佈局呈現菜單。

echo $this->element('your menu'); 

爲了使它動態設置菜單鏈接,可能是控制器中的數組。

1

我不知道爲什麼這不記錄在任何地方,但我只是昨晚找到了這個。佈局或元素的變量必須使用_for_layout結尾進行定義。例如:$ this-> set('categories_for_layout',$ this-> Category-> find('all'));

我在AppController類中使用了beforeFilter方法,因爲我需要每個頁面中的菜單。

相關問題