使用cakePHP我的目标是在一个布局页面中组合两个或多个控制器的索引视图。
实施例: 我有控制器:新闻,事件,链接。 我想在一个布局页面中显示每个表的最后五个条目。 此外,当选择来自视图的其中一个链接时,它应该将用户带到该记录的相应视图。
我已阅读了views上的书籍部分,但没看到如何查看元素是否可以实现这一目标。
让我感到困惑的是如何将三个独立的控制器/视图组合成一个布局?
由于
答案 0 :(得分:5)
首先我要说视图和控制器不一定绑在一起--Cake会隐式添加文件层次/命名约定所指定的视图,但这不一定是这种情况。因此,请尝试将视图视为与控制器分离(这是使用MVC架构的主要目的之一)。
假设您的三个视图(A,B,C)正是您希望它们复制的方式,请将它们放入一个元素(它只是位于特殊APP / views / elements /目录中的视图文件)。现在你可以在布局或其他视图中使用它们,只需调用$ this->元素('elementName',array('options'))。
基本上,只需将要显示的代码抽象为元素,然后将这些元素插入到所需的布局中。
答案 1 :(得分:5)
在新闻,事件和链接模型中创建方法以获取最后5条记录。然后在你的控制器中要么在Controller :: uses属性中包含模型,要么在操作中使用ClassRegistry :: init()来访问模型,例如
function my_action() {
$news = ClassRegistry::init('News')->getRecent();
$events = ClassRegistry::init('Event')->getRecent();
$links = ClassRegistry::init('Link')->getRecent();
$this->set(compact('news', 'events', 'links'));
}
然后,您可以从任何控制器操作调用这些模型方法,使应用程序保持干燥状态。
在my_action.ctp视图中,以及其他许多视图中,只需渲染元素,例如
// my_action.ctp
<?php
echo $this->element('recent_news');
echo $this->element('recent_events');
echo $this->element('recent_links');
?>
然后,您的元素可以迭代显示项目的$ news(或其他)变量,并带有指向各自控制器中“视图”操作的链接。
仅仅因为控制器匹配模型,并不意味着你不能在其中使用其他模型。
答案 2 :(得分:2)
您可以将控制器设置为使用RequestHandler,然后使您的视图元素能够从应用程序中的单独控制器中获取自己的数据。
此链接比我更好地解释了它 http://bakery.cakephp.org/articles/view/creating-reusable-elements-with-requestaction
要记住的一件事是,您调用的控制器操作应该考虑缓存他们自己的数据,这样您就不会进行不必要的数据库查询。