这是一个相当广泛的问题,但我将尝试回答它。我不确定你的编程知识有多先进,所以如果我重复你已经知道的事情,请原谅我。首先,当我第一次开始使用该框架时,这篇文章给了我很大的帮助,因为它解释了哪些代码应该去哪里以及为什么。这是我见过的最接近“参考应用程序”的工具,它实际上是一个很棒的学习工具。您可以尝试查看一些更高级的 Cake 应用程序,例如Croogo(基于 Cake 的 CMS)。但是代码库肯定会有点复杂。
当你想在不同的视图中实际重用元素时,我个人会使用元素。然而,问题在于为元素提供数据。有一种方法叫做requestAction
,但即使是手册也指出这应该适度使用并与缓存结合使用。问题在于,在不同元素中使用大量requestAction
调用会使您的控制器充满方法,并且不遵守“瘦控制器,胖模型”的口头禅。
我会将大部分相关的数据调用放在它们各自的模型中,并从控制器调用这些模型方法并将它们提供给视图。因此,假设您想要 10 个最新的电话号码和相关用户。
您的 PhoneNumber 模型中有一个方法,该方法返回一组用户及其电话号码。使用Containable 行为来限制返回的相关模型的数量。下面的代码是一个示例,因此实际实现可能会有所不同:
public function getRecentPhoneNumbers($limit=10) {
$phoneNumbers = array();
$phoneNumbers = $this->find('all', array(
'limit' => $limit,
'contain' => array('User'),
'order' => 'PhoneNumber.id DESC'
));
return $phoneNumbers;
}
如果 PhoneNumber 和 User 模型正确相关,您将能够getRecentPhoneNumbers()
从 User 模型调用:
$this->PhoneNumber->getRecentPhoneNumbers(10)
或从用户控制器:
$this->User->PhoneNumber->getRecentPhoneNumbers(10)
假设您有一个元素显示这 10 个数字的列表,并且它接受一个名为 的变量$recentPhonenumbers
,然后您使用调用返回的数组在相关的 UsersController 方法中设置该变量getRecentPhoneNumbers
:
$this->set('recentPhonenumbers', $this->User->PhoneNumber->getRecentPhoneNumbers(10));
这将使它对包含该元素的视图可用。
扩展视图相对较新(从 Cake 2.1 起),我没有使用过它们,但似乎是创建条件标记的好方法。
至于第二个问题,将用户重定向到人员视图,而不是索引视图。这是在 Controller 的方法中调整重定向的问题(有关详细信息,请参阅手册)。edit()
标准烘焙的 edit() 方法接受一个$id
参数,您可以使用它来重定向到view()
(它可能也接受一个$id
参数)。
所以重定向可能看起来像这样:
$this->redirect(array('controller' => 'users', 'action' => 'index'));
将其更改为:
$this->redirect(array('controller' => 'users', 'action' => 'view', $id));