CakePHP ControllerとViewの繋がり
環境:CakePHP2 PHP5.5.19
今まで謎だったControllerとViewの値の受け渡し。
ちょっとだけ使い方がわかった、
というか渡し方はわかったため、備忘録として残す。
例えば、ある画面(View:action)に入った時から
次の次の画面まで値をPOSTしたまま、
持ち越したいという場合に使える。
SessionとかではなくPOSTでできる。
というか、Sessionのやり方は知らない。
というか、言葉の使い方も多分違う。
また、いろいろわかったらnoteに書くぜ!
Controller側
UserController.php
// 例えば
// 画面表示の段階で日付を取得
// Userの情報を取得するメソッド(_getUserInfo($date = null))から情報取得
function index(){
$now = new DateTime();
$date = date_format($now, 'Ymd');
$userInfo = $this->_getUserInfo($date);
$this->request->data['User']['id'] = $userInfo[0];
$this->request->data['User']['name'] = $userInfo[1];
$this->request->data['User']['age'] = $userInfo[2];
$this->request->data['User']['birthday'] = $userInfo[3];
}
例えば、画面表示段階の日付を使ってユーザーの情報を取得。
それをrequest->dataで保持(?)。
View側
User/index.ctp
<?php echo $this->Form->create('User', array( //いろいろ )); ?>
// 何らかの画面表示用の処理
<input type="button" value="送信" id="btn_submit" />
<div class="invisible">
<?php echo $this->Form->input('Button.submit_type', array('type' => 'text', 'id' => 'submit_type'));?>
<?php echo $this->Form->hidden('name');?>
<?php echo $this->Form->hidden('age');?>
<?php echo $this->Form->hidden('birthday');?>
</div>
<?php echo $this->Form->end(); ?>
<script type="text/javascript">
$("#btn_submit").click(function(){
$("#submit_type").val('submit');
submitForm();
});
</script>
Formヘルパーを使ってControllerから持って来た値を
ここでPOSTして持ち越し。
Controller側 第2の画面用
UserController.php
function change_info(){
$name = $this->data['User']['name'];
$this->request->data['User']['name'] = $name;
$age = $this->data['User']['age'];
$this->request->data['User']['age'] = $age;
// 多分これでOK
$this->request->data['User']['birthday'] = $this->data['User']['birthday'];
}
次のactionでも値を保持するためにViewから受け取った値を
$this->request->dataに代入。
View側 第2の画面
User/change_info.ctp
<?php echo $this->Form->create('User', array( //いろいろ )); ?>
// 何らかの画面表示用の処理
// POSTした値を使う
<?php echo h($this->data['User']['name']);?>
<?php echo h($this->data['User']['age']);?>
<?php echo h($this->data['User']['birthday']);?>
<input type="button" value="送信" id="btn_submit" />
<div class="invisible">
<?php echo $this->Form->input('Button.submit_type', array('type' => 'text', 'id' => 'submit_type'));?>
<?php echo $this->Form->hidden('name');?>
<?php echo $this->Form->hidden('age');?>
<?php echo $this->Form->hidden('birthday');?>
</div>
<?php echo $this->Form->end(); ?>
<script type="text/javascript">
$("#btn_submit").click(function(){
$("#submit_type").val('submit');
submitForm();
});
</script>
これを繰り返したらControllerとViewを行き来しながら値を保持できる。
もし、DB更新などに使う場合は、
DB更新のメソッド内で再度、送信されて受け取った値を
$this->request->dataで突っ込んであげればいい。
Controller側 DB更新用メソッド
UserController.php
function _user_update(){
try{
$this->User->begin();
$rec = array();
// 更新のため、主キーを呼び出す。
$rec['id'] = $data['User']['id'];
$rec['name'] = $this->request->data['User']['name'];
$rec['age'] = $this->request->data['User']['age'];
$rec['birthday'] = $this->request->data['User']['birthday'];
$rec['updated_count'] = $data['User']['updated_count'];
if(!$this->User->save($rec)){
// エラー処理
return false;
}
$this->User->commit();
}catch(Exception $e){
$this->User->rollback();
// 例外処理 ログ出力
return;
}
// Update成功の画面へ
}
以上。
上級者から見たら何言ってんだこいつという部分は
多々あるかと思うが、一旦いまの実力ではこういった理解である。
またなんかわかったら更新するぜ!