FuelPHP

FuelPHPでデータの更新(実践編その2)

更新日:

今日は、先日『FuelPHPでデータの新規作成』で作成したデータの更新方法を調べてみます。editアクションとeditビューを作成しますが、その前にindexビューから指定データへ移動できるようにindexビューファイルの13行目を修正します。

1. indexビューファイルを下記のように修正します。

app/views/collection/index.php

<h2>コレクション一覧</h2>
 <table width="100%" border="1">
 <tr>
 <th scope="col">ID</th>
 <th scope="col">タイトル</th>
 <th scope="col">作成日</th>
 <th scope="col">コード</th>
 <th scope="col">保管場所</th>
 </tr>
 <?php foreach($query as $row): ?>
 <tr>
 <td><?=$row['id']?></td>
 <td><?php echo Html::anchor('collection/edit/'.$row['id'],$row['title'])?></a></td>
 <td><?=$row['created']?></td>
 <td><?=$row['col_code']?></td>
 <td><?=$row['save_space']?></td>
 </tr>
 <?php endforeach;?>
 </table>

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

app/classes/controller/collection.php

public function action_edit($id){
 //もしPOST送信されたら
 if (Input::method() == 'POST'){
 //データの整理
 $title=Input::post('title');
 $modified=Input::post('modified');
 $col_code=Input::post('col_code');
 $save_space=Input::post('save_space');
 //連想配列にデータをセット
 $data=array(
 'title'=>$title,
 'modified'=>$modified,
 'col_code'=>$col_code,
 'save_space'=>$save_space,
 );
 //指定idのデータを更新するSQLの発行
 $query = DB::update('collections')->set($data)->where('id',$id)->execute();
 //indexページへ移動
 return Response::redirect('collection/index');
 } //POST送信されていなければ
 //指定idのデータを取得するSQLの発行
 $query=DB::select()->from('collections')->where('id',$id)->execute();
 //ビューファイルの呼び出し
 $view=View::forge('collection/edit');
 $view->set('query',$query->as_array());
 return $view;
 }

3. editビューも作成します。

app/views/collection/edit.php

<?php foreach($query as $row):endforeach?>
<h2>データ更新</h2>
<form name="form1" method="post" action="">
 <table width="100%" border="1">
 <tr>
 <th scope="row">タイトル</th>
 <td><input name="title" type="text" id="title" value="<?=$row['title']?>"></td>
 </tr>
 <tr>
 <th scope="row">更新日</th>
 <td><label for="created"></label>
 <input name="created" type="text" id="created" value="<?php echo date("Y-m-d H:i:s")?>"></td>
 </tr>
 <tr>
 <th scope="row">コード番号</th>
 <td><label for="col_code"></label>
 <input name="col_code" type="text" id="col_code" value="<?=$row['col_code']?>"></td>
 </tr>
 <tr>
 <th scope="row">保管場所</th>
 <td><label for="save_space"></label>
 <input name="save_space" type="text" id="save_space" value="<?=$row['save_space']?>"></td>
 </tr>
 <tr>
 <th colspan="2" scope="row"><input type="submit" name="button" id="button" value="送信"></th>
 </tr>
 </table>
</form>

4. 10~13行目の更新日に関しては、『hidden属性』にして表示しないようにするか、コントローラの中で日付データを作成して入力するのが普通だと思いますが、ここではとりあえずそのままにしておきます。

5. 尚、データ更新後に最後に入力したデータが表示されるように降順で並び替えさせたいので、indexアクションでデータを呼び出すときにorder_by()メソッドで降順に指定しています。

app/classes/controller/collection.php

public function action_index(){
 //Collectionsテーブルのデータを降順で取得
 $query=DB::select()->from('collections')->order_by('modified','desc')->execute();
 //ビューファイルの呼び出し
 $view=View::forge('collection/index');
 //データベース情報の引き渡し
 $view->set('query',$query->as_array());
 return $view;
 }

5. それではブラウザで確認してみます。修正するタイトル名をクリックします。

http://ドメイン名/colleciotn

6. データを修正して送信ボタンをクリックすれば、データが更新されます。

本日のコード解説

  • Html::anchor($href,表示テキスト,属性配列,$secure)
    anchorメソッドは、HTMLのanchorタグを返します。 第1引数には、ターゲットURLを指定します。第2引数は表示文字列を指定します。第3引数はanchorタグの属性を配列で指定します。第4引数には生成されるURLのセキュア指定をします。第4引数をtrueにすると、『https://』になります。 

7. ビューファイルindex.phpの13行目はHtmlクラスのanchorメソッドを利用しています。普通に<a href="collection/edit/<?=$row['id']?>">でも大丈夫そうな気がしますが、データ修正後のアドレスが変更されるため、エラーが表示されます。13行目を下記コードに変更してちょっと試してみます。

<td><a href="collection/edit/<?=$row['id']?>"><?=$row['title']?></a></td>

8. URLが『ドメイン名/collection/』の時に、リンクをクリックして見ます。

9. きちんと指定したデータへ移動しています。

10. データを修正後にindex.phpへ移動したときにアドレスが変わっています。

11. 再度同じリンクをクリックしても、存在しないアドレスを指定していますので、エラーが表示されます。これは、昔CodeIgniterの勉強を始めたばかりの時にはまりました。

  • DB::update('テーブル名')->set($data)->where('id',$id)
    DBクラスのupdateメソッドを使うときは、where()のチェーンメソッドを付け忘れないように注意して下さい。私事ですが、SQLの勉強を始めた頃にWHERE句を付け忘れて全てのデータが同じ内容で変更された苦い経験があります。

本日は以上です。

-FuelPHP
-

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