在CakePHP中创建动态数据库驱动菜单的最佳方法是什么?

时间:2009-03-05 08:41:07

标签: php cakephp

我想在从数据库运行的每个页面上显示一个菜单。使用简单的下来和脏的PHP很容易但我想使用他们的MVC系统将它与cakephp集成。 现在我的问题是如何才能解决这个问题?

我的想法是使用布局创建一个元素,然后为所有逻辑创建一个组件或控制器。有什么建议吗?或者是我想要使用的助手?

我还需要从数据库中的多个表中获取所有数据。是否最好通过一个模型完成所有数据采集逻辑?或者在菜单控制器(或组件)中完成大部分操作并使用每个表的模型?

谢谢,

沃尔特

6 个答案:

答案 0 :(得分:7)

模型应该从他们正在建模的表中获取和处理数据,因此获取该模型中每个模型的菜单数据。

组件用于容纳多个控制器共享的逻辑,因此所有控制器使用的菜单组件听起来都是放置代码以从模型中获取菜单数据并将其混合在一起的好地方。

菜单通常是一个嵌套列表,如果菜单也是如此,输出标记的最简单方法是递归函数(一个调用自身的函数),它一次输出一个级别,所以而不是一个元素,我只是在那里创建一个带有menu()方法的帮助器,并直接从布局中调用它。

答案 1 :(得分:4)

我同意neilcrooks的回答,但为了清楚起见,我想补充一些内容。

助手和元素非常简单,除了帮助者可以更健壮一点(至少,这就是我对他们的看法;))。因此,如果您使用帮助程序,您可以动态绑定和取消绑定模型关联 - 这将允许您从(临时)关联模型中获取数据。

就个人而言,我喜欢胖模型和瘦调控制​​器,所以我想如果我遇到这种情况,我会使用帮助器暂时将模型绑定到它。我需要从现有模型中获取的任何数据都可以通过Model1-> fetchMenuPart(...)类型调用来访问。

然后你可以从你的布局文件中调用你的助手。

答案 2 :(得分:1)

我不知道为什么在任何地方都没有记录,但我昨晚才发现这一点。必须使用结尾_for_layout定义布局或元素的变量。例如:$ this-> set('categories_for_layout',$ this-> Category-> find('all'));

我在AppController类中使用了beforeFilter方法,因为我在每个页面都需要该菜单。

答案 3 :(得分:1)

这是我在互联网上搜索此内容时发现的一个很好的解决方案。

http://articles.classoutfit.com/cakephp-dynamic-navigation-bars/

答案 4 :(得分:0)

我认为你会使用创建一个元素来保存菜单的html,然后在你的布局中渲染菜单。

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

要使其动态化,您可以设置菜单链接,也可以作为控制器中的数组。

答案 5 :(得分:0)

我在这里找到了一篇好文章 http://www.milestree.com/webdev/cakephp/dynamic_menu