FuelPHPでデータの削除(実践編その3)

今日は、FuelPHPでデータの削除方法を勉強してみたいと思います。『FuelPHPでデータの更新』の続きです。データの削除だけなら簡単に終わってしまいますので、今回は、indexページからdeleteページやeditページへ直接移動ではなく、ワンクッションを置くための、明細ページ(detail)ページも作成したいと思います。

1.  deleteアクションに関しては、必ずワンクッションを置くように作成して下さい。確認用のページや確認用のダイアログがないままdeleteアクションを実行しますと、大事なデータがほんのワンクリックで削除されてしまうようなことになります。

2. あれこれページを作っていくとレイアウトが面倒になりますので、先日ご紹介したテンプレートファイルを使って、レイアウトもしてきたいと思います。

3. まず基本となるテンプレートページを作成します。app/viewsにcollection_template.php名でファイルを作成し、下記のように記述します。

app/views/collection_template.php

<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8">
 <title><?php echo $title; ?></title>
 <meta name="viewport" content="width=device-width,minimum-scale=1">
 <?php echo Asset::css('bootstrap.min.css');?>
 <?php echo Asset::css('bootstrap-responsive.min.css');?>
 <?php echo Asset::css('my-style.css');?>
</head>
<body>
<div class="navbar">
 <div class="navbar-inner">
 <div class="container">
 <a class="brand" href="#">WinRoad徒然草</a>
 <form action="" method="post" class="navbar-search pull-right">
 <input name="search" type="text" class="search-query" id="search" placeholder="search">
 </form>
 </div><!--/contain-->
 </div><!--/navbar-innner-->
</div><!--/navbar-->
<div class="container">
 <div class="row" id="content">
 <div class="span3">
 <ul class="nav nav-list">
 <li><?php echo Html::anchor('collection/index/','TOP',array('class'=>'btn'))?></li>
 <li><?php echo Html::anchor('collection/add/','新規作成',array('class'=>'btn'))?></li>
 </ul>
 </div><!--/span3-->
 <div class="span9">
 <?php echo $content; ?>
 </div><!--/span9-->
 </div><!--/content-->
 <div class="row" id="footer">
 <p>copyright(c)2012 WinRoad徒然草 {exec_time}s<br>
 表示速度{exec_time}s 使用メモリ{mem_usage}mb</p>
 </div><!--/footer-->
</div><!--/container-->
 <?php echo Asset::js('jquery-1.7.1.min.js');?>
 <?php echo Asset::js('bootstrap.min.js');?>
</body>
</html>

4. テンプレートページを作成したら、まずindexビューから修正します。

app/views/colleciotn/index.php

<h3>コレクション一覧</h3>
<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/detail/'.$row['id'],
 $row['title'],array(
 'class'=>'btn btn-success','id'=>'a_btn',
 ))?></a></td>
 <td><?=$row['created']?></td>
 <td><?=$row['col_code']?></td>
 <td><?=$row['save_space']?></td>
 </tr>
<?php endforeach;?>
</table>

5. detailビューを作成します。indexページのタイトル名をクリックするとdetailページへ移動するように作成しています。

app/views/collection/detail.php

<?php foreach($query as $row):endforeach?>
 <div class="btn-group">
 <h3>明細ページ</h3>
 <?php echo Html::anchor('collection/edit/'.$row['id'],'修正',array('class'=>'btn btn-success span1'))?>
 <?php echo Html::anchor('collection/delete/'.$row['id'],'削除',array('class'=>'btn btn-danger span1'))?>
 </div>
 <table width="100%" border="1">
 <tr>
 <th width="20%" scope="row">ID</th>
 <td width="80%"><?=$row['id']?></td>
 </tr>
 <tr>
 <th scope="row">タイトル</th>
 <td><?=$row['title']?></td>
 </tr>
 <tr>
 <th scope="row">種別</th>
 <td><?=$row['col_assort_id']?></td>
 </tr>
 <tr>
 <th scope="row">作成日</th>
 <td><?=$row['created']?></td>
 </tr>
 <tr>
 <th scope="row">更新日</th>
 <td><?=$row['modified']?></td>
 </tr>
 <tr>
 <th scope="row">コード番号</th>
 <td><?=$row['col_code']?></td>
 </tr>
 <th scope="row">保管場所</th>
 <td><?=$row['save_space']?></td>
 </tr>
 <tr>
 <th scope="row">備考</th>
 <td><?=$row['note']?></td>
 </tr>
 </table>

6. ほとんど修正していないですが、editページも記述しておきます。

<?php foreach($query as $row):endforeach?>
<h4>データ更新</h4>
<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="note"></label>
 <input name="col_assort_id" type="text" id="textfield" value="<?=$row['col_assort_id']?>"></td>
 </tr>
 <tr>
 <th scope="row">更新日</th>
 <td><label for="modified"></label>
 <input name="modified" type="text" id="modified" 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="col_assort_id"></label>
 <input name="save_space" type="text" id="textfield2" value="<?=$row['save_space']?>"></td>
 </tr>
 <tr>
 <th scope="row">備考</th>
 <td><label for="note"></label>
 <input name="note" type="text" id="note" value="<?=$row['note']?>"></td>
 </tr>
 <tr>
 <th colspan="2" scope="row"><input type="submit" name="button" id="button" value="送信" class="btn btn-primary span2"></th>
 </tr>
 </table>
</form>

7. そして今回のテーマであるdeleteページを作成しますが、deleteページはeditページとほとんど変わりません。違うところといえば、コントローラにデータ削除用のidを送るためのフォームを作成しています。

app/views/collection/delete.php

<?php foreach($query as $row):endforeach?>
 <?php echo Form::open('collection/delete/'.$row['id'])?>
 <?php echo Form::hidden('id',$row['id'])?>
 <?php echo Form::submit('','このデータを削除いたします',array('class'=>'btn btn-danger span9'))?>
 <?php echo Form::close()?>
 <h4>データ削除</h4>
 <table width="100%" border="1">
 <tr>
 <th width="20%" scope="row">ID</th>
 <td width="80%"><?=$row['id']?></td>
 </tr>
 <tr>
 <th scope="row">タイトル</th>
 <td><?=$row['title']?></td>
 </tr>
 <tr>
 <th scope="row">種別</th>
 <td><?=$row['col_assort_id']?></td>
 </tr>
 <tr>
 <th scope="row">作成日</th>
 <td><?=$row['created']?></td>
 </tr>
 <tr>
 <th scope="row">更新日</th>
 <td><?=$row['modified']?></td>
 </tr>
 <tr>
 <th scope="row">コード番号</th>
 <td><?=$row['col_assort_id']?></td>
 </tr>
 <tr>
 <th scope="row">保管場所</th>
 <td><?=$row['save_space']?></td>
 </tr>
 <tr>
 <th scope="row">備考</th>
 <td><?=$row['note']?></td>
 </tr>
 </table>

8.  そして最後にCollectionコントローラの全コードを下記に記述しておきます。あちこち手直ししましたので、一つ一つ説明するには長くなりすぎますので、コードで確認して下さい。

app/classes/controller/collection.php

<?php
class Controller_Collection extends Controller_Template{
 //テンプレートファイルの指定
 public $template='collection_template';
 public function action_index(){
 //Collectionsテーブルのデータを降順で取得
 $query=DB::select()->from('collections')->order_by('modified','desc')->execute();
 //テンプレートファイルの呼び出し
 $this->template->content=View::forge('collection/index');
 //データベースをテンプレートに渡す
 $this->template->content->set('query',$query->as_array());
 }
 public function action_add(){
 //もしPOST送信されたら
 if (Input::method() == 'POST'){
 //データの整理
 $title=Input::post('title');
 $col_assort_id=Input::post('col_assort_id');
 $created=Input::post('created');
 $col_code=Input::post('col_code');
 $save_space=Input::post('save_space');
 $note=Input::post('note');
 //連想配列にデータをセット
 $data=array(
 'title'=>$title,
 'col_assort_id'=>$col_assort_id,
 'created'=>$created,
 'col_code'=>$col_code,
 'save_space'=>$save_space,
 'note'=>$note,
 );
 //SQLの発行
 $query = DB::insert('collections')->set($data)->execute();
 //indexページへ移動
 return Response::redirect('collection/index');
 } //POST送信されていなければ
 //addビューの呼び出し
 $this->template->content=View::forge('collection/add');
 }
 public function action_edit($id){
 //もしPOST送信されたら
 if (Input::method() == 'POST'){
 //データの整理
 $title=Input::post('title');
 $col_assort_id=Input::post('col_assort_id');
 $modified=Input::post('modified');
 $col_code=Input::post('col_code');
 $save_space=Input::post('save_space');
 $note=Input::post('note');
 //連想配列にデータをセット
 $data=array(
 'title'=>$title,
 'col_assort_id'=>$col_assort_id,
 'modified'=>$modified,
 'col_code'=>$col_code,
 'save_space'=>$save_space,
 'note'=>$note,
 );
 //SQLの発行
 $query = DB::update('collections')->set($data)->where('id',$id)->execute();
 //indexページへ移動
 return Response::redirect('collection/index');
 } //POST送信されていなければ
 //指定idのデータを取得
 $query=DB::select()->from('collections')->where('id',$id)->execute();
 //ビューファイルの呼び出し
 $this->template->content=View::forge('collection/edit');
 $this->template->content->set('query',$query->as_array());
 }
 public function action_detail($id){
 //idが送信されたら
 if(Input::method() == 'GET'){
 //SQLの発行
 $query=DB::select()->from('collections')->where('id',$id)->execute();
 //ビューファイルの呼び出し
 //$view=View::forge('collection/detail');
 $this->template->content=View::forge('collection/detail');
 //ビューに値の引き渡し
 $this->template->content->set('query',$query->as_array());
 //return $view;
 }
 }
 public function action_delete($id){
 //idがPOST送信されたら
 if(Input::method() == 'POST'){
 //SQLの発行
 $query=DB::delete('collections')->where('id',$id)->execute();
 //indexページへ移動
 return Response::redirect('collection/index');
 }else{
 $query=DB::select()->from('collections')->where('id',$id)->execute();
 //ビューファイルの呼び出し
 $this->template->content=View::forge('collection/delete');
 //ビューに値の引き渡し
 $this->template->content->set('query',$query->as_array());
 }
 }
}

本日のコード解説

9. deleteアクションは、ページ遷移がPOSTかGETかで削除と表示に分けています。idがPOST送信されたら、データを削除するためのSQLを発行していますし、それ以外(GET送信)の場合は、送られてきたidのデータを選択して表示しています。

10. CakePHPにはpostLink、postButtonという便利なメソッドがあります。私の勉強不足かもしれませんが、FuelPHPにもこれと同じようなメソッドがあれば便利だと思いますし、もっとコードが簡単になります。

今日は特に解説するほどのコードがありませんので、この辺にします。

このエントリーを含むはてなブックマーク Buzzurlにブックマーク livedoorクリップ Yahoo!ブックマークに登録

トラックバック&コメント

この投稿のトラックバックURL:

コメントをどうぞ

このページの先頭へ