CRUDの基本について (6/9)
作成:2015-09-19 11:17
更新:2015-09-19 11:17
更新:2015-09-19 11:17
■エンティティ更新のeditメソッド
では、コントローラー側にアクションを作成しましょう。PersonsControllerクラスに、下のリスト欄のメソッド(editメソッド)を追加して下さい。これで、編集するレコードのID番号を指定してeditにアクセスをします。例えば、ID = 1番の編集をしたいなら、
こんな感じでアクセスをします。これで、ID = 1のレコードの内容がフォームに表示された状態で現れます。そのまま内容を書き換えて送信すると、そのレコードの内容が更新されます。
・指定IDのエンティティ取得
先ず最初に行っているのは、引数で渡される$idの番号のエンティティを取得し変数$personに収める作業です。これは、モデルの「get」メソッドを使います。このメソッドは、引数に指定したIDのエンティティを取り出すものです。
・isでアクセス方法をチェックする
その後、requestのisを使い、アクセス方式をチェックして分岐をします。先に、POSTかどうかをチェックするのに使いましたが、今回は少し変わっています。isの引数に、['patch', 'post', 'put']という配列を用意していますね。これがポイントです。
フォームヘルパーを使い、エンティティの値を更新させる場合、単にif ($this->request->is('post'))ではうまくいきません。POSTの他に、PUTというアクセスもチェックして処理を行わせるようにする必要があります。
・フォームの内容をマージする
ifの値がtrueならば、フォームから送信された値をエンティティにマージします。getで取得したエンティティ($person)と、フォーム送信されたデータ($this->request->data)をマージすることで、値が変更されたエンティティが作成されます。
・エンティティを保存し、リダイレクトする
・if-elseで変数を設定する
if文のelse側(つまり、GETアクセスした時に実行される部分)にも文が必要になります。それは、$personの値を「person」という名前で設定する処理です。これが、テンプレート側に渡され、フォームに表示されていたのですね。
http://localhost:8765/persons/edit/1
こんな感じでアクセスをします。これで、ID = 1のレコードの内容がフォームに表示された状態で現れます。そのまま内容を書き換えて送信すると、そのレコードの内容が更新されます。
・指定IDのエンティティ取得
$person = $this->Persons->get($id);
先ず最初に行っているのは、引数で渡される$idの番号のエンティティを取得し変数$personに収める作業です。これは、モデルの「get」メソッドを使います。このメソッドは、引数に指定したIDのエンティティを取り出すものです。
・isでアクセス方法をチェックする
if ($this->request->is(['post', 'put'])) {……
その後、requestのisを使い、アクセス方式をチェックして分岐をします。先に、POSTかどうかをチェックするのに使いましたが、今回は少し変わっています。isの引数に、['patch', 'post', 'put']という配列を用意していますね。これがポイントです。
フォームヘルパーを使い、エンティティの値を更新させる場合、単にif ($this->request->is('post'))ではうまくいきません。POSTの他に、PUTというアクセスもチェックして処理を行わせるようにする必要があります。
・フォームの内容をマージする
$person = $this->Persons->patchEntity($person, $this->request->data);
ifの値がtrueならば、フォームから送信された値をエンティティにマージします。getで取得したエンティティ($person)と、フォーム送信されたデータ($this->request->data)をマージすることで、値が変更されたエンティティが作成されます。
・エンティティを保存し、リダイレクトする
if ($this->Persons->save($person)) {
return $this->redirect(['action' => 'index']);
}
・if-elseで変数を設定する
} else {
$this->set('person', $person);
}
if文のelse側(つまり、GETアクセスした時に実行される部分)にも文が必要になります。それは、$personの値を「person」という名前で設定する処理です。これが、テンプレート側に渡され、フォームに表示されていたのですね。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
1 2 3 4 5 6 7 8 9 10 11 12 | public function edit( $id = null) { $person = $this ->Persons->get( $id ); if ( $this ->request->is([ 'post' , 'put' ])) { $person = $this ->Persons->patchEntity( $person , $this ->request->data); if ( $this ->Persons->save( $person )) { return $this ->redirect([ 'action' => 'index' ]); } } else { $this ->set( 'person' , $person ); } } |
※関連コンテンツ
「初心者のためのCakePHP3 プログラミング入門」に戻る