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

时间:2013-12-06 22:20:00

标签: php cakephp routing cakephp-2.0 subroutine

如果我使用错误的术语描述我正在尝试做的事情,请道歉......

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

example.com/reports/view/123

每个报告都包含AndBelongsToMany文件对象。我需要像这样访问这些文件:

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

或者

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

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

在CakePHP中执行此操作的正确方法是什么?

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

1 个答案:

答案 0 :(得分:0)

您走在正确的道路上,修改您的行动以接受可选参数。

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'))
}

然后在yourAwesomeElement

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

好处是你的元素可以重用于将来可能需要它的视图。