31

コントローラを通常とは異なるビューにレンダリングする方法はありますか?コントローラからデフォルト以外のビューにデータを渡そうとしています。私のコントローラーの意味は次のとおりです。

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にあります

私が持っているもう1つの質問は、CakePHPフレームワークの外部でctpファイルではなくPHPにその値を渡す方法です。

私はここからすべてを試しましたが、運がありませんでした。

4

7 に答える 7

62

正しい方法:

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

上記の答えが述べているよう$this -> setに、変数をビューに渡すために使用できます。

ただし、それでも必要なものが得られない場合。アクションに別のレイアウト(デフォルト以外のレイアウト)も表示する必要があると思います。試してみることができます$this -> layout = 'layoutname';(レイアウトはレイアウトフォルダにあり、デフォルトはdefault.ctpです)。

注: CakePHPのコントローラーは、データを非表示ファイル(.phpなど)に渡すようには設計されていません。CakePHPのビューはで終わるはず.ctpです。

于 2012-07-30T05:10:02.130 に答える
45

私はむしろ使用したい:

$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');
于 2014-02-08T15:17:26.893 に答える
11

.ctp 拡張子なしでビューの名前を付けてみてください。

$this->render('file');
于 2012-07-29T17:39:44.677 に答える
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」を返す必要があります。わからないので2つめの質問ですみません。CakePHP によると、 $this -> set( ) を使用して設定された変数 [stocksTR] は、手動レンダリング ビュー ページ [ 'index.ctp' ] でも使用できるようになります。

于 2014-02-04T17:48:18.927 に答える
0
 $this->view  = '/TestView/index';
 $this->set('stocksRT', $this->StockRealtime->find('all'));
于 2015-05-06T13:34:17.777 に答える
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`);

    }
}
于 2012-07-30T04:44:04.517 に答える