cakePHP:如何在一个cakePHP布局页面上组合两个或多个应用程序视图?

Pau*_*aul 4 cakephp views controllers

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

示例:我有控制器:新闻,事件,链接.我想在一个布局页面中显示每个表的最后五个条目.此外,当选择来自视图的其中一个链接时,它应该将用户带到该记录的相应视图.

我已阅读了有关视图的书籍部分,但没有看到如何查看元素将实现此目的.

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

谢谢

Tra*_*leu 5

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

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

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


nei*_*kes 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'));
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以从任何控制器操作调用这些模型方法,从而保持应用程序干燥.

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

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

然后,您的元素可以迭代显示项目的$ news(或其他)变量,其中包含指向各自控制器中"视图"操作的链接.

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