我有一个从我的 layouts/default.ctp 文件中调用的侧边栏导航元素,我需要从我的 Photos 控制器访问一些关于类别的数据。我该怎么做呢?
4 回答
小心 requestAction 除非您有效地使用缓存,否则它会真正减慢您的应用程序,因为每次调用它时它都会启动一个全新的请求周期。
Travis Leleu 的回答将是标准的做事方式。但是,如果您必须将数据(出于可移植性或任何原因)导入到元素中,那么 requestAction 不是要走的路。
由于您没有执行任何必须在控制器中的业务逻辑,我强烈建议您将模型类作为单例导入并实例化到您的元素中。您可以使用 ClassRegistry::init();
$Photo = ClassRegistry::init('Photo');
$Photo->find('all');
如果您需要对数据进行任何额外的处理,您应该在模型本身中使用 Cakes afterFind 回调或在您的 Photo 模型中创建自定义方法:
class Photo extends AppModel {
function customFind () {
$photos = $this->find('all');
foreach ($photos as $photo) {
//processing code here...
}
}
}
然后在你的元素中调用它:
$Photo = ClassRegistry::init('Photo');
$Photo->customFind();
基本上,我在这里想要解决的是 requestAction 适合的唯一情况是您需要执行诸如重定向或使用组件之类的事情。
如果您只是简单地检索和/或操作数据,那么它属于模型。
你可以把你的layous/default.ctp当作一个普通的模板,然后把
<?php echo $this->element('your element'); ?>
你需要它的地方。
顺便说一句,使用:
$data = $this->requestAction('controller/action');
访问数据
您可以将数据发送到您的元素。例如在你的 default.ctp 中:
<?php echo $this->element('side_nav', $your_data); ?>
在您的 side_nav.ctp 中,您可以处理该数据。
你为什么不为此做标准的蛋糕约定呢?
在控制器中,
$this->set('categories', $this->Photos->find(...) );