コントローラを通常のビューとは異なるビューにレンダリングする方法はありますか?コントローラからデフォルト以外のビューにデータを渡そうとしています。私のコントローラーは次のように呼ばれます:
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 からすべてを試してみましたが、運はありません。
正しい方法:
$this -> render('TestView/index');
上記の答えが言及しているように、$this -> set
を使用して変数をビューに渡すことができます。
しかし、それがあなたが望むものを与えない場合。アクションで別のレイアウト(デフォルト以外のレイアウト)を表示することも必要だと思います。 $this -> layout = 'layoutname';
を試すことができます(レイアウトはレイアウトフォルダーにあり、デフォルトではdefault.ctpです)。
注: CakePHPのコントローラーは、非ビューファイル(.phpなど)にデータを渡すようには設計されていません。 CakePHPのビューは.ctp
で終わるはずです。
私はむしろ使用したい:
_$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');
_
ビューの名前に.ctp拡張子を付けないでください。
$this->render('file');
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');
}
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`);
}
}
$this->view = '/TestView/index';
$this->set('stocksRT', $this->StockRealtime->find('all'));