将控制器渲染到CakePHP中的不同视图

dev*_*ter 25 php cakephp

有没有办法将控制器渲染到不同的视图然后正常?我正在尝试将一些数据从控制器传递到非默认视图.意思是我的控制器被调用:

class StocksRealtimeController extends AppController {
    var $uses               = 'StockRealtime';
    function index(){
        $action = '/TestView';
        $this->set('stocksRT', $this->StockRealtime->find('all'));
        //$this -> viewPath = 'Pages';
        $this -> render('/TestView/index');
    }
}
Run Code Online (Sandbox Code Playgroud)

...我的视图在views-> TestView-> index.ctp中

我的另一个问题是,如何将该值传递给PHP而不是CakePHP框架之外的ctp文件?

我从这里尝试了一切,没有运气.

40P*_*lot 56

正确的方式:

$this -> render('TestView/index');

如上所述,您可以使用$this -> set将变量传递给View.

但是,如果那不能给你你想要的东西我猜你也想要动作来显示另一个布局(非默认布局).您可以尝试$this -> layout = 'layoutname';(布局在布局文件夹中,默认为default.ctp)

注意: CakePHP的控制器不能将数据传递给非视图文件(如.php).CakePHP的观点应以.ctp结尾

  • 对我来说,我需要在路径前面放一个 / (例如`/TestView/index`)。 (2认同)
  • 一个警告.在设置viewVars之前调用`$ this-> render()`将使它们在您的视图中不可用. (2认同)
  • `render()`方法将停止控制器执行,并且该行之后的任何代码都将被省略.相反,设置`view`属性是一个更好的主意,应该接受来自@Sabin Neagu的答案. (2认同)

Sab*_*agu 42

我宁愿使用:

$this->view = 'file';
Run Code Online (Sandbox Code Playgroud)

因为$this->set('var', $val)你所拥有的任何东西都$this->render('file')无法达到你的观点.

在CakePHP 3.x中使用:

$this->viewBuilder()->template('file');
Run Code Online (Sandbox Code Playgroud)

  • 这应该是推荐的答案; 它最适合蛋糕范例. (5认同)
  • 同意,对我来说看起来更灵活.这应该是公认的答案. (2认同)
  • 现在在 CakePHP 3.7 中 - $this->viewBuilder()->setTemplate('file'); - 警告 (512):ViewBuilder::template() 已弃用。使用 ViewBuilder::setTemplate() 或 ViewBuilder::getTemplate() 代替 (2认同)

小智 11

尝试放置没有.ctp扩展名的视图名称.

$this->render('file');
Run Code Online (Sandbox Code Playgroud)