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

时间:2012-07-29 17:31:59

标签: 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');
    }
}

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

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

我尝试了here的所有内容而没有运气。

7 个答案:

答案 0 :(得分:54)

正确的方式:

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

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

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

注意: CakePHP的控制器不是为了将数据传递给非视图文件(如.php)而设计的。 CakePHP的观点应该以{{1​​}}结尾。

答案 1 :(得分:41)

我宁愿使用:

$this->view = 'file';

因为$this->set('var', $val)之后您拥有的任何$this->render('file')都无法覆盖您的观点。

在CakePHP 3.x中使用:

$this->viewBuilder()->template('file');

在CakePHP 3.7中不推荐使用。 改为使用它(正如Kuldeep Choudhary在评论中所建议的那样)

ViewBuilder::setTemplate('file');

答案 2 :(得分:11)

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

$this->render('file');

答案 3 :(得分:3)

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'
     */
   }
}

尝试一下,返回'KEYWORD'必须在那里成功渲染视图页面。 抱歉第二个问题,因为我没有得到它。 根据CakePHP,使用设置的变量[stocksTR] $ this - > set(),也可以在手动渲染视图页面['index.ctp']中使用。

答案 4 :(得分:0)

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

    function index(){

       $this->layout = NULL;
       $this->autoRender = false;

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

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

    }
}

答案 5 :(得分:0)

 $this->view  = '/TestView/index';
 $this->set('stocksRT', $this->StockRealtime->find('all'));

答案 6 :(得分:0)

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