見出し画像

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成功の画面へ


以上。

上級者から見たら何言ってんだこいつという部分は

多々あるかと思うが、一旦いまの実力ではこういった理解である。

またなんかわかったら更新するぜ!



いいなと思ったら応援しよう!