4

使用 cakePHP,我的目标是在一个布局页面中组合两个或多个控制器的索引视图。

示例:我有以下控制器:新闻、事件、链接。我想在一个布局页面中显示每个表的最后五个条目。Also, when one of the links from the views is selected it should take the user to the respective view for that record.

我已经阅读了有关视图的书籍部分,但看不到如何将视图变成元素来实现这一点。

让我困惑的是如何将三个独立的控制器/视图组合成一个布局?

谢谢

4

3 回答 3

5

首先我想说视图和控制器不一定绑定在一起——Cake 会隐式添加由文件层次结构/命名约定指定的视图,但这不一定是这种情况。因此,请尝试将视图与控制器分离(这是使用 MVC 架构的主要目的之一)。

假设您的三个视图(A、B、C)正是您希望它们复制的方式,请将它们放入一个元素(这只是一个位于特殊 APP/views/elements/ 目录中的视图文件)。现在您可以在布局或其他视图中使用它们,只需调用 $this->element( 'elementName', array( 'options' ) )。

基本上,只需将要显示的代码抽象为元素,然后将这些元素插入所需的布局。

于 2009-11-17T16:21:31.953 回答
5

在您的 News、Event 和 Link 模型中创建用于获取最后 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'));
}

然后,您可以从任何控制器操作调用这些模型方法,保持您的应用程序 DRY。

在您的 my_action.ctp 视图以及许多其他视图中,只需渲染元素,例如

// my_action.ctp
<?php
echo $this->element('recent_news');
echo $this->element('recent_events');
echo $this->element('recent_links');
?>

然后,您的元素可以只遍历 $news(或其他)变量,以显示带有指向其各自控制器中的“视图”操作的链接的项目。

仅仅因为控制器与模型匹配,并不意味着您不能在其中使用其他模型。

于 2009-11-17T21:00:31.257 回答
2

您可以将控制器设置为使用 RequestHandler,然后使您的视图元素能够从应用程序中的单独控制器获取自己的数据。

这个链接比我能解释得更好 http://bakery.cakephp.org/articles/view/creating-reusable-elements-with-requestaction

要记住的一件事是,您调用的控制器操作应该考虑缓存它们自己的数据,这样您就不会进行不必要的数据库查询。

于 2009-11-17T19:13:19.773 回答