web-dev-qa-db-ja.com

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

...そして、私のビューはviews-> TestView-> index.ctpにあります

私が持っている別の質問は、その値をPHPに渡し、CakePHPフレームワーク外のctpファイルではない方法ですか?

here からすべてを試してみましたが、運はありません。

25
devmonster

正しい方法:

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

上記の答えが言及しているように、$this -> setを使用して変数をビューに渡すことができます。

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

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

55
40Plot

私はむしろ使用したい:

_$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');
_
42
Sabin Neagu

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

$this->render('file');
11
user1548335
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']を手動でレンダリングする際にも使用できます。

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');
}
0
Ajay Kori
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`);

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