CakePHP

CakePHP2.1でデータの更新(実践編その2)

更新日:

今日は、CakePHPでデータの更新方法を勉強してみます。『CakePHPでデータの新規作成』の続きからやります。前回は、データの新規作成後にindexページへ移動するまでを勉強してみました。今日の課題であるデータの更新を作成するために、editアクションとeditビューを作成します。

1. Collectionコントローラにeditアクションを追加します。

public function edit($id=null){}

2. 編集画面表示用のedit.ctpを作成します。

app/View/Collection/edit.ctp

<h1>編集用画面</h1>
 <p>ここにデータ編集用のページを作成します。</p>

3. これでブラウザでhttp://ドメイン名/collecion/editと入力すると、edit.ctpが表示されるようになりました。

4. データの更新(編集)ページは、データのidで個別のデータを取得するように設定しますので、editアクションを下記のように記述します。

public function edit($id=null){
 $this->Collection->id = $id;
 //指定プライマリーキーのデータをセット
 $this->request->data = $this->Collection->read(null,$id);

5. edit.ctpに個別データを表示するように下記のように修正します。

<h1>編集用画面</h1>
<?php
 //フォームの開始を宣言する
 echo $this->Form->create('Collection');
 //入力フォームの生成
 echo $this->Form->input('title');
 echo $this->Form->input('created');
 echo $this->Form->input('col_code');
 echo $this->Form->input('save_space');
 //フォームの終了宣言
 echo $this->Form->end('送信');
 ?>

6. これで、ブラウザからhttp://ドメイン名/collection/edit/1と入力すると、id=1のデータを取得した編集画面が表示されます。

7. 次にこの編集したデータを保存するためにeditアクションを下記のように修正します。

public function edit($id=null){
 $this->Collection->id=$id;
 //リクエストがPOSTかPUTの場合
 if($this->request->is('post') || $this->request->is('put')){
 //リクエストデータの内容でデータを更新
 $this->Collection->save($this->request->data);
 //indexページへ移動する
 $this->redirect('index');
 //リクエストがPOST,PUT以外の場合
 }else{
 //指定プライマリーキーのデータをセット
 $this->request->data=$this->Collection->read(null,$id);
 }
 }

8. それでは、データを修正してみましょう。id=1のデータを修正します。

http://ドメイン名/collection/edit/1

9. データが修正されました。

10. ブラウザからidを指定して修正ページへ移動することは出来ますが、実際上は修正したいデータを選択して修正ページへ移動するのが普通ですので、indexページから修正ページへ移動するためのリンクを作成します。

11. タイトル名をクリックしたら修正ページへ移動したいので、タイトル名のデータにリンクを作成します。index.ctpを下記のように修正します。

app/View/Collection/index.ctp

<h1>私のコレクション</h1>
 <table cellpadding="0" cellspacing="0">
 <tr>
 <th><?php echo "ID";?></th>
 <th><?php echo "タイトル";?></th>
 <th><?php echo "作成日";?></th>
 <th><?php echo "更新日";?></th>
 <th><?php echo "コード番号";?></th>
 <th><?php echo "保管場所";?></th>
 </tr>
 <?php
 foreach ($Collections as $row): ?>
 <tr>
 <td><?php echo h($row['Collection']['id']); ?>&nbsp;</td>
 <td><?php echo $this->Html->link($row['Collection']['title'],array('action'=>'edit',h($row['Collection']['id'])));?>&nbsp;</td>
 <td><?php echo h($row['Collection']['created']); ?>&nbsp;</td>
 <td><?php echo h($row['Collection']['modified']); ?>&nbsp;</td>
 <td><?php echo h($row['Collection']['col_code']); ?>&nbsp;</td>
 <td><?php echo h($row['Collection']['save_space']); ?>&nbsp;</td>
 </tr>
 <?php endforeach; ?>
 </table>

12. ブラウザで確認してみます。これで修正ページへ移動するようになりました。

本日のコード解説

$this->モデル名->read('フィールドリスト','プライマリーキー')

指定したプライマリーキーに対するレコードを取得します。取得できる値はfind()と同じ形式のものです。$this->Collection->read(null,$id)は下記のコードと同じです。

$this->Colleciton->find('first',array(
 'conditions'=>array('id'=>$id)
));

$this->Html->link('タイトル','URL',オプション配列,確認メッセージ)

リンク(アンカータグ)を生成します。タイトルとして画像等のHTML文字列を用いる場合はオプション配列でエスケープを指定する必要があります。また、確認メッセージに文字列を指定することで、確認用のダイアログを出すことが出来ます。OKボタンが押された場合に先に進めるようになります。試しに上記index.ctpのリンク部分を下記のように修正してみます。

<?php echo $this->Html->link($row['Collection']['title'],
 array('action'=>'edit',h($row['Collection']['id'])),
 array(),'『'.h($row['Collection']['title']).'』 の編集ページへ移動します');?>

下記のようにダイアログボックスが表示されます。

本日は以上です。

-CakePHP
-

Copyright© WinRoad徒然草 , 2018 All Rights Reserved Powered by AFFINGER5.