一个视图中的多个模型的数据(网页)

joe*_*pet 2 php model-view-controller cakephp

我是MVC模式的新手,但一直试图掌握它,例如通过阅读我想尝试的CakePHP框架的文档.但是,现在我偶然发现了一个我不确定如何处理的场景.

我正在处理的网站包含九个固定页面,也就是说,除了那些页面之外,永远不会存在任何其他页面.每个页面都包含特定的内容,例如访客留言页面包含留言簿备注.但是,此外,每个页面都有一个小的新闻框和一个管理员应该能够编辑的简短的事实框.从我的角度来看,那些应该被视为模型,例如NewsPost和ShortFact,属于控件NewsPostController和ShortFactController.请注意,它们彼此完全无关.

现在,我的问题是,如何创建包含留言簿备注以及新闻邮箱和短暂事实的单一视图(网页)?我是:

  1. 为留言簿设置一个唯一的控制器GuestBookController(带有index()动作),以便访问www.domain.com/guest_book让索引操作获取最新的新闻帖子和随机的短暂事实?

  2. 将静态页面放在/ pages /中让PagesController进行提取?

  3. <请在这里填写正确的方法.>

提前致谢!

ben*_*ley 7

听起来你需要调查元素,否则你可以将它嵌入到布局中 - 但是如果你问我,它可以使用元素,将事物分开.

http://book.cakephp.org/2.0/en/views.html#elements

这些允许您创建可以嵌入到其他视图中的小视图.

您可能还需要将一些逻辑放入AppController(记住所有其他控制器扩展app控制器)以加载这些视图所需的数据.beforeRender函数应该对此有用 - 它是cakephp提供的一个钩子函数,所以如果你在控制器上定义它,它总是在渲染视图之前完成动作后调用.

你的AppController中的这样的东西应该有所帮助:

function beforeRender() {
  $this->dostuff();
}

function doStuff() {
  // do what you need to do here - eg: load some data.
  $shortfacts = $this->ShortFact->findAll();
  $news = $this->NewsPost->findAll();
  // news and shortfacts will be available within the $shortfacts and $news variables in the view.
  $this->set('shortfacts', $shortfacts);
  $this->set('news', $news);
}
Run Code Online (Sandbox Code Playgroud)

如果在app控制器中需要模型以便在此doStuff方法中使用,那么您需要在AppController顶部的使用中定义它们

class AppController {
  var $uses = array('NewsPost', 'ShortFact');
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,除非您严格使用bindModel()和unbindModel(),否则有时可能会包含不必要的组件.这些允许您动态绑定/取消绑定模型到控制器.但是,我现在不会太担心速度.实际上,如果你需要速度,CakePHP不是要走的路...... (2认同)