FuelPHP

FuelPHPでバリデーション処理(実践編その5)

更新日:

今日は、入力フォームのバリデーション処理を行いたいと思います。『FuelPHPでデータ検索』の続きです。前回までは、モデルは使用しないで、データベース接続をしていましたが、データの接続やバリデーション処理はモデル内で処理を行った方が楽ですので、モデルの作成から行いたいと思います。

モデルの作成

1. まず、ORMを利用してデータベース接続を行うための設定をします。ORMとはオブジェクトリレーションマッパーといい、オブジェクトにデータベーステーブルの行をマップし、オブジェクト間のデータのやりとりを簡単にするためのアプリケーションです。

2. ORMパッケージは、FuelPHPに最初から含まれていますので、configファイルのパッケージにORMを追加するだけで利用できます。configファイルの188行目あたりに、下記のように記述します。

app/config/config.php

'packages' => array(
 'orm',
 ),

3. 環境によっては、Eメールを使用するための'email'パッケージや認証の為の'auth'パッケージも登録されていると思います。私の場合は、下記のようになっています。

'packages' => array(
 'email',
 'orm',
 'auth',
 ),

4.  それでは、モデルを作成します。下記のように記述します。バリデーションの設定もモデル内でします。

app/classes/model/collection.php

<?php
 class Model_Collection extends Orm\Model{
 //使用するフィールド名をセット
 protected static $_properties = array(
 'id',
 'title',
 'created',
 'modified',
 'col_code',
 'save_space',
 'col_assort_id',
 'picture_id',
 'note',
 );
 //テーブル名がモデル名の複数形なら省略可
 protected static $_table_name = 'collections';
 //プライマリーキーがidなら省略可
 protected static $_primary_key = 'id';
 //バリデーションの設定
 public static function validate($factory)
 {
 $val = Validation::forge($factory);
 $val->add_field('title', 'タイトル', 'required|max_length[255]');
 $val->add_field('col_code', 'コード番号', 'required');
 $val->add_field('save_space', '保管場所', 'required|max_length[100]');
return $val;
 }
 }

5. addアクションをモデルを使用してデータ入力するように修正します。

app/classes/controller/collection.php

public function action_add($id=null){
 //もしPOST送信されたら
 if (Input::method() == 'POST')
 {
 $val = Model_Collection::validate('add');
if ($val->run())
 {
 $collection = Model_Collection::forge(array(
 'title' => Input::post('title'),
 'created' => date('Y-m-d H:i:s'),
 'modified' => date('Y-m-d H:i:s'),
 'col_code' => Input::post('col_code'),
 'save_space' => Input::post('save_space'),
 'col_assort_id' => Input::post('col_assort_id'),
 'picture_id' => Input::post('picture_id'),
 'note' => Input::post('note'),
 ));
//もしデータが保存されたら
 if ($collection and $collection->save())
 {
 Session::set_flash('success', '<span class="btn btn-primary span8">ID-'.$collection->id.'の『'.$collection->title.'』を追加しました</span><br>');
 //indexページへ移動
 Response::redirect('collection/index');
 }
 else //データが保存されなかったら
 {
 Session::set_flash('error', '保存できませんでした');
 }
 }
 else //バリデーションNGなら
 {
 Session::set_flash('error', $val->show_errors());
 }
 }
$this->template->content = View::forge('collection/add');
}

6. addビューもモデルを使用するように修正します。

app/views/collection/add.php

<h3>新規作成</h3>
<?php echo Form::open(array('name'=>'add','method'=>'post')); ?>
<?php echo '<div class="alert-error">'.Session::get_flash('error').'</div>'?>
 <table width="100%" border="0">
 <tr>
 <th align="right" scope="row">タイトル:</th>
 <td class="input"><?php echo Form::input('title', Input::post('title', isset($collection) ? $collection->title : ''), array('class' => 'span6')); ?>
&nbsp;</td>
 </tr>
 <tr>
 <th align="right" scope="row">種別:</th>
 <td><?php echo Form::input('col_assort_id', Input::post('col_assort=id', isset($collection) ? $collection->col_assort_id : ''), array('class' => 'span6')); ?>
&nbsp;</td>
 </tr>
 <tr>
 <th align="right" scope="row">コード番号:</th>
 <td><?php echo Form::input('col_code', Input::post('col_code', isset($collection) ? $collection->col_code : ''), array('class' => 'span6')); ?>
&nbsp;</td>
 </tr>
 <tr>
 <th align="right" scope="row">保管場所:</th>
 <td><?php echo Form::input('save_space', Input::post('save_space', isset($collection) ? $collection->save_space : ''), array('class' => 'span6')); ?>
&nbsp;</td>
 </tr>
 <tr>
 <th align="right" scope="row">備考:</th>
 <td><?php echo Form::textarea('note', Input::post('note', isset($collection) ? $collection->note : ''), array('class' => 'span6', 'rows' => 8)); ?>
&nbsp;</td>
 </tr>
 <tr>
 <th colspan="2" scope="row">
 <?php echo Form::submit('submit', '保存', array('class' => 'btn btn-primary span4')); ?>
 </th>
 </tr>

</table>
<?php echo Form::close(); ?>

7. ブラウザで確認してみます。何も入力せずにEnterしてみます。

8. モデル内で設定したバリデーションのエラーメッセージが3つ表示されています。尚、エラーメッセージが英語表記の方は、『FuelPHPのFieldsetでEメール送信』の中程にエラーメッセージを日本語化する方法を記載しておりますので、参考にして下さい。

9. 必須項目の3つだけを入力してみます。きちんとデータが入力されました。

本日のコード解説

10. それでは、本日使用したコードを見てみたいと思いますが、本日使用しているValidationクラスのメソッドやバリデーションルールに関しては、『FuelPHPのValidationクラス』を参照して下さい。

  • Validation::forge(フィールドセット名)
    新しいフィールドセットのインスタンスを生成します。
  • add_field(名前、ラベル、ルール)
    フィールドセットを追加するメソッドです。
  • Session::set_flash(セッション名,セットする値)
    セッションのフラッシュ変数をセットします。フラッシュ変数とは、短期間使用する変数の事です。config(環境設定)で変更することは可能ですが、基本的に次のページの要求後か、そのセッションの取得後に削除されるように設定されています。値は配列でもセットすることが出来ます。
  • Session::get_flash(セッション名,初期値)
    set_flashでセットしたフラッシュ変数を取得します。要求されたフラッシュ変数が存在しない場合は、第2引数の値が戻ります。第2引数の初期値はnull値です。indexページの最初の部分にデータがフラッシュ変数が表されるように記述を変更しました。フラッシュ変数(success)があれば、セットされた値が表示され、無ければ、第2引数の『コレクション一覧』が表示されます。
    <h3><?php echo Session::get_flash('success','コレクション一覧');?></h3>

本日は以上です。

追加記事 2012/06/07

上記記事で、addアクションは、修正したのですが、editアクションを修正し忘れていましたので、ここで修正しておきます。

app/classes/controller/collection.php

//Ormモデルを使用して作成
public function action_edit($id){
//もしPOST送信されたら
if (Input::method() == 'POST'){
//バリデーションのインスタンス化
$val=Model_Collection::validate('edit');
//バリデーションOKなら
if($val->run()){
//モデルに値をセット
$collection=Model_Collection::find($id);
$collection->title=Input::post('title');
$collection->col_assort_id=Input::post('col_assort_id');
$collection->modified=date('Y-m-d H:i:s');
$collection->col_code=Input::post('col_code');
$collection->save_space=Input::post('save_space');
$collection->note=Input::post('note');
//もしデータが保存されたら
if ($collection and $collection->save()){
//セッションフラッシュのセット
Session::set_flash('success', '<span>ID-'.$collection->id.'の『'.$collection->title.'』を更新しました</span><br>');
//indexページへ移動
Response::redirect('collection/index');
}else {
//データが保存されなかったら
Session::set_flash('error', '保存できませんでした');
}
} else { 
//バリデーションNGなら
Session::set_flash('error', $val->show_errors());
}
}
//指定idのデータを取得
$data['collection']=Model_Collection::find($id);
//モデルColassrotからデータを取得
$colassorts=Model_Colassort::find('all');
foreach($colassorts as $row):
//id番号をキーにして配列assortsを作成
$data['assorts'][$row->id]=$row->as_name;
endforeach;
//テンプレートファイルにデータの引き渡し
$this->template->title="WinRoad徒然草";
$this->template->content = View::forge('collection/edit', $data);
}

editビューも修正しておきます。

app/views/collection/edit.php

<h3>データ更新</h3>
<?php echo Form::open(array('name'=>'edit','method'=>'post')); ?>
<?php echo '<div class="alert-error">'.Session::get_flash('error').'</div>'?>
 <table width="100%" border="0">
 <tr>
 <th align="right" scope="row">タイトル:</th>
 <td class="input"><?php echo Form::input('title', Input::post('title', isset($collection) ? $collection->title : ''), array('class' => 'span6')); ?>
&nbsp;</td>
 </tr>
 <tr>
 <th align="right" scope="row">種別:</th>
 <td><?php echo Form::select('col_assort_id',$collection->col_assort_id,$assorts,array('class'=>'span3')); ?>
&nbsp;</td>
 </tr>
 <tr>
 <th align="right" scope="row">コード番号:</th>
 <td><?php echo Form::input('col_code', Input::post('col_code', isset($collection) ? $collection->col_code : ''), array('class' => 'span6')); ?>
&nbsp;</td>
 </tr>
 <tr>
 <th align="right" scope="row">保管場所:</th>
 <td><?php echo Form::input('save_space', Input::post('save_space', isset($collection) ? $collection->save_space : ''), array('class' => 'span6')); ?>
&nbsp;</td>
 </tr>
 <tr>
 <th align="right" scope="row">備考:</th>
 <td><?php echo Form::textarea('note', Input::post('note', isset($collection) ? $collection->note : ''), array('class' => 'span6', 'rows' => 8)); ?>
&nbsp;</td>
 </tr>
 <tr>
 <th colspan="2" scope="row">
 <?php echo Form::submit('submit', '保存', array('class' => 'btn btn-primary span4')); ?>
 </th>
 </tr>

</table>
<?php echo Form::close(); ?>

以上です。ご参考までに (^0^)

-FuelPHP
-

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