从元素访问控制器数据

时间:2010-03-16 02:18:32

标签: php cakephp access-control

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

4 个答案:

答案 0 :(得分: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是合适的,你需要做重定向或使用组件的事情。

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

答案 1 :(得分:1)

您可以将layous / default.ctp视为普通模板,然后输入

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

你需要的地方。

b.t.w,使用:

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

访问数据

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:-1)

为什么你不这样做的标准派对约定呢?

在控制器中,

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