1

我有一个从我的 layouts/default.ctp 文件中调用的侧边栏导航元素,我需要从我的 Photos 控制器访问一些关于类别的数据。我该怎么做呢?

4

4 回答 4

2

小心 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 适合的唯一情况是您需要执行诸如重定向或使用组件之类的事情。

如果您只是简单地检索和/或操作数据,那么它属于模型。

于 2010-03-17T03:24:32.250 回答
1

你可以把你的layous/default.ctp当作一个普通的模板,然后把

<?php echo $this->element('your element'); ?>

你需要它的地方。

顺便说一句,使用:

$data = $this->requestAction('controller/action');

访问数据

于 2010-03-16T02:37:02.080 回答
0

您可以将数据发送到您的元素。例如在你的 default.ctp 中:

<?php echo $this->element('side_nav', $your_data); ?>

在您的 side_nav.ctp 中,您可以处理该数据。

于 2010-03-17T04:13:49.267 回答
-1

你为什么不为此做标准的蛋糕约定呢?

在控制器中,

$this->set('categories', $this->Photos->find(...) );

于 2010-03-16T16:05:57.593 回答