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

在CakePHP中将控制器渲染到不同的视图,php,cakephp,Php,Cakephp,有没有一种方法可以将控制器渲染到与普通视图不同的视图?我正在尝试将一些数据从控制器传递到非默认视图。这意味着我的控制器被称为: class StocksRealtimeController extends AppController { var $uses = 'StockRealtime'; function index(){ $action = '/TestView'; $this->set('stocksRT

有没有一种方法可以将控制器渲染到与普通视图不同的视图?我正在尝试将一些数据从控制器传递到非默认视图。这意味着我的控制器被称为:

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');
    }
}
。。。我的视图在views->TestView->index.ctp中

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


我尝试了从中的所有内容,但运气不佳。

尝试将视图的名称放在不带.ctp扩展名的位置

$this->render('file');
正确的方法:

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

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

然而,如果这不能满足你的需求。我猜您还希望该操作显示另一个布局(非默认布局)。您可以尝试执行
$this->layout='layoutname'(版面位于版面文件夹中,默认打开为default.ctp)

注意:CakePHP的控制器不是为将数据传递到非视图文件(如.php)而设计的。CakePHP的视图应该以
.ctp
结尾

class StocksRealtimeController extends AppController
{
   var $uses = 'StockRealtime';

   function index( )
   {
     $this->layout     = NULL;
     $this->autoRender = false;

     $this->set('stocksRT', $this->StockRealtime->find('all'));

     return $this -> render('/TestView/index');
     /*
        $this -> render('/TestView/index');
        Here 'TestView' must be a Folder named same as "public $name" variable value        
        in Controller and an "index.ctp" must be situated under TestView Folder.
       'index'
     */
   }
}
尝试一下,返回“关键字”必须在那里才能成功呈现视图页面。 对不起,第二个问题我没听懂。 根据CakePHP,变量[stocksTR]是使用 $this->set(),也将在手动渲染视图页面['index.ctp']上提供

我宁愿使用:

$this->view = 'file';
因为
$this->set('var',$val)
之后的任何
$this->render('file')
都不会到达您的视图

在CakePHP 3.x中,使用:

$this->viewBuilder()->template('file');
在CakePHP3.7中已弃用。 改用这个(正如Kuldeep Choudhary在评论中建议的那样)


我按照您的建议做了,但页面仍在查找testcontroller=>“错误:找不到TestViewController”。这就是我在示例中所做的。可能我迟到了。。但是,如果您设置变量“*\u for\u layout”也将在layout中可用。对于我来说,我需要在路径前面放置一个/(例如,
/TestView/index
)。一个警告。在设置viewVars之前调用
$this->render()
将使它们在视图中不可用。
render()
方法将停止控制器的执行,并且该行之后的任何代码都将被忽略。改为设置
视图
属性是一个更好的主意,应该接受@Sabin Neagu的答案。截止日期,如果要从
/app/view
中呈现视图,则需要一个前导的
/
,如果要呈现的视图来自插件,则不需要前导的
/
。链接到适当的文档。难怪!我很确定我设置的变量是正确的,但是视图弹出一个提示,没有设置“it”。谢谢你的提示!这应该是建议的答案;它最符合蛋糕模式。同意,在我看来更灵活。这应该是公认的答案。现在在CakePHP 3.7中-$This->viewBuilder()->setTemplate('file');-警告(512):不推荐使用ViewBuilder::template()。改为使用ViewBuilder::setTemplate()或ViewBuilder::getTemplate()
$this->viewBuilder()->template('file');
ViewBuilder::setTemplate('file');
 $this->view  = '/TestView/index';
 $this->set('stocksRT', $this->StockRealtime->find('all'));
public function admin_index() { 

    $this->layout = 'admin/table';

    $action = '/Vendors';

    $this->Prg->commonProcess('Vendor');

    $this->paginate = array('conditions' => array($this->Vendor->parseCriteria($this->passedArgs)), 'order' => 'Vendor.created_on DESC', 'limit' => 15);

    $this->set('vendor', $this->paginate('Vendor'));

    $this->render('/vendors/admin_items');
}