CakePHP:如何使用子视图执行子操作


CakePHP: how to do sub-actions with sub-views

如果我使用了错误的术语来描述我试图做的事情,请道歉…

我有一个名为Report的模型/控制器,用户可以这样查看:

example.com/reports/view/123

每个报表都有AndBelongToMany文件对象。我需要让这些文件可以访问,如下所示:

example.com/reports/view/123/file/456

example.com/reports/view/123/456
                          ^   ^
                          |   |
                      report  file

我有意不为文件(example.com/files/view...)创建单独的操作,因为对文件的访问是相对于报告的。

在CakePHP中,正确的方法是什么?

我的第一个猜测是在ReportsController::view内部添加逻辑,以检查第二个参数(文件)的存在,并有条件地手动render()一个不同的视图(用于文件)。但我不确定这是否是"CakePHP方式"。

如果路径正确,请修改操作以接受可选参数。

public function view($file = null) {
    $somethingElse = null;
    if (isset($file)) {
        //your logic
        $somethingElse = $this->Foo->bar();
    }
    $this->set(compact('somethingElse'));
}

关于视图,我不知道你的要求,但我认为你不需要创建不同的视图,你可以在视图中放置一个条件来显示一些东西,或者(我最喜欢的方法)创建一个只有$somethingElse包含一些东西才会显示的元素。即:

//View code
if (!empty($somethingElse)) {
    echo $this->element('yourAwesomeElement', compact('somethingElse'))
}

然后在你的真棒元素

foreach ($somethingElse as $something) {
    echo $something;
}

好的一面是,您的元素将可用于未来可能需要它的视图。