(゚д゚)ノ今日も暑いぜカルピスうまい!!(中の人の地元の方言で『こんばんわ』の意(うそです(ぉ


こんばんわ、夏バテ気味の中の人です。


19時ごろに更新できなかったので0時に。(しょっぱなからかrorz


さてCodeigniterでの主な概念もあともうすこしとなりました。(つまりもうちょいで最低限の内容が終わる訳デスネ


というわけで今回はバリデーション。


バリデーションとぁ→DB登録時に登録するデータが正しい形式になっているかどうかをチェックする機能。

問題があれば『間違ってるぞ(゚Д゚#)ゴールァ!!』と表示するなり『再入力しろ(゚Д゚#)ゴールァ!!』と表示したりする処理のことですぉ。((゚Д゚#)ゴールァ!!はいらんけど…。


こうしたバリデーションの機能はCodeigniterでは『validation』というライブラリとして用意されてます。そのまんまやん。


(゚д゚)クワッ まぁ当然ライブラリなので読み込めば使えます。使う際にはロードしませう。


まぁ当然ライブラリ読み込みとしうことで前にも『自動で読むZE!!』という説明をした例のアレについても触れておきますか。


autoload.phpを開いて

$autoload['libraries'] = array('database','validation');

とすれば毎回自動でバリデーションライブラリが呼ばれます。


また、必要に応じて

$this->load->library('validation');

とするのも一つの手です。


直接loadで呼ぶ場合には$autoloadへの設定は不要です。


           ___
          ./autoload\
          .| ^   ^  |
          | .>ノ(、_, )ヽ、.| <あまり私を呼ばない方がいい
         __! ! -=ニ=- ノ!___
    /´ ̄ ̄ .|\`ニニ´/    `ヽ
   {      .|__  ̄ ̄ヾ      }
   i;;',,,  r---イ     /|,、_,,  ,',;:',i
   .l;';',;,,  }  /;\     / ヽ / ,;,;;',;l
   .|;;',;,   } ./;;;,, \   / ;;;;;;ヽ ,,;;','i
   i;',,   / /;;,',';;  ノ--, ',',;;::',',゙i ,,';';i
   i;,';  /./,',',';;" /   \ ',',',;;,'i ,;',i
  /  / i 、  /    ヽ ',;::'、|  \
 ヽヽヽヾ丿  〈       ヽ''  {////
  ```` ト,   i        | 、 i´´´
      |',',;;  }        ! ',',;;i
      |,','、 /        ヽ',',','|
      !;;', /          !,',;,;'|



(´ω`;)でぁ実際にバリデーションつくっていきませうか。


まずはadd.phpを修正します。『views』フォルダ内のadd.phpを修正。


<h1>Blog新規作成</h1>
<p>新しい記事を記述してください。</p>
<form method="POST" action="/igniterapp/helo/add">
<table>
<tr>
<th>TITLE</th>
<td><input type="text" name="title" size="60"></td>
</tr>
<tr>
<th>CONTENT</th>
<td><textarea name="content" cols="40" rows="3"></textarea></td>
</tr>
<tr>
<th></th>
<td><input type="submit"></td>
</tr>
</table>
</form>


↑を↓のように修正


<h1>Blog新規作成</h1>
<p>新しい記事を記述してください。</p>
<?=$this->load->library('validation') ?>
<?=$this->validation->error_string ?>

<form method="POST" action="/igniterapp/helo/add">
<table>
<tr>
<th>タイトル</th>
<td><input type="text" name="title" size="60"></td>
</tr>
<tr>
<th>コンテンツ</th>
<td><textarea name="content" cols="40" rows="3"></textarea></td>
</tr>
<tr>
<th></th>
<td><input type="submit"></td>
</tr>
</table>
</form>


まぁ<?=$this->validation->error_string ?>を追加して項目を日本語にしただけですがね。

(゚д゚)<?=$this->validation->error_string ?>の部分はエラーが生じた際にフォーム手前にエラーメッセージを出力する処理になります。

$validationはvalidetionライブラリで用意されたバリデーション処理を行うオブジェクトです。

今回はその中でもエラー出力処理を司るerror_stringというメンバー変数を出力してます。
メンバ変数ってなんぞ??って…言う人は華麗にスルー…どうしようかな(ぉ

validationライブラリの中で宣言されて使われている変数とでも考えておkなんじゃ?(違う場合は突っ込んでorz

とりあえずこのクラス変数にはエラーが発生した際に「こんなエラーがありますYO!」というメッセージが格納されます。
なのでそれを出力すればどこがおかしいのかを出力することができるのですYO!

でぁ次にコントローラーのaddメソッドの修正作業へ移りませう。


helo.php

function add

function add(){
if($this->input->post('title') != null){
$data = array(
'timestamp'=> time(),
'title'=> $this->input->post('title',true),
'content'=> $this->input->post('content',true)
);
$this->db->insert('blogs',$data);

redirect(base_url().'helo/index');

}else{
$data = array('head_title'=>'ADD BLOG','content'=>'add');
$this->load->view('layout/mylayout',$data);
}
}

↑を修正し、フォームの内容をバリデーションでチェックするようにしませう。


function add(){

$rules = array('title'=>'required','content'=>'required');
$this->validation->set_rules($rules);
if($this->validation->run()){
$data = array(
'timestamp'=> time(),
'title'=> $this->input->post('title',true),
'content'=> $this->input->post('content',true)
);
$this->db->insert('blogs',$data);

redirect(base_url().'helo/index');

}else{
$data = array('head_title'=>'ADD BLOG','content'=>'add');
$this->load->view('layout/mylayout',$data);
}
}
↑修正。バリデーション関連の行が二行追加された後にif文の内容も修正。
そして忘れちゃいけないライブラリ読み込み。今回の例では自動読みではなくわざわざ個別で呼ぶことにしてみませう。

function Helo(){
parent::Controller();
$this->load->helper('url');
$this->load->scaffolding('blogs');
$this->load->library('validation');
}

というわけでコンストラクタでちゃんとバリデーションのライブラリを読み読み。
autoload設定していない例での肝はビュー、コントローラーの双方でライブラリを読む行
$this->load->library('validation');を挿入しませう。
ビュー、コントローラーのどちらか片方のライブラリ読み込み行が欠けても動かないです。注意。

では実際に見てみましょう。
http://localhost/igniterapp/helo/add へアクセスヽ( ^ω^)ノ サクセス!



PHP2009-44


そして実際に何も入力せずにクエリ送信!ぽちっとな。



PHP2009-45



見事に怒られます。
            ___
          ./    \
          .| ^   ^ |
          | .>ノ(、_, )ヽ、.|
         __! ! -=ニ=- ノ!_
       .| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄|
   ,. -‐ '|                      |
  / :::::::::::|    あまり              |__
  / :::::::::::::|                   rニ-─`、
. / : :::::::::::::|             私を  `┬─‐ .j
〈:::::::::,-─┴-、                  |二ニ イ
. | ::/ .-─┬⊃                 |`iー"|
.レ ヘ.  .ニニ|_____________|rー''"|
〈 :::::\_ノ::::::::::::::::::::::::::::::::::::::::::::::::::::::: |:::::::: /::::::::::::|

              _
                 /  \
           /   ノ(  \
           | ^ ⌒ ^ |   
           | .>ノ(、_, )ヽ、.|    <怒らせない方がいい
             ! ! -=ニ=- ノ!
   | ̄ ̄ ̄〉,ァ''" \`ニニ´/゙ア´ ̄`/ ̄ ̄ ̄ ̄|
   |     `r´、、__ l ! ィ彡,ャァ'" ,,..,,、\     |
 ,-┴-、 あ〈.,, ``''ヽ,,,  ''"´   ゙''ヾミ,r/.く     |__
/ .-┬⊃  <    ,;,, ;;; ,,;;       ,fr::<,   rニ-─`、
! ;;ニ|    /    ';;;;;;;;;;;'      ,!;V:.:ノ     `┬─‐ j
\_|    <    ':;;;;;:'      ,;;/;;:.:/:〈 私を   |二ニ ノ
   |    <    人__,,,;;;;;ノ/N/:/:.<     |`ー"
   |__/:ト-―テ" ⌒ `ヾj ::;;;;}/:.:.:∠____|
        l   ' -:十:‐' ゙l,  〃:.:.:/:.リ      ビリィィィ
        l   t,,__,災_,ノl  f:.リ:.:./:.j


(((゚Д゚;)))


英語でテラ怒られますが、このままでは何言ってるかわかんねーよ!って人。(゚д゚)大丈夫!日本語化できますYO!

日本語化は後でとりあげます。


解説いくぉー。⊂二二二( ^ω^)二⊃ブーン


$rules = array('title'=>'required','content'=>'required');
この部分はルールの設定部分。どの項目に対してどのようなルールを適用するかを指定します。形式は連想配列。


☆ミキラッなバリデーションルール一覧
required -値が空でないか調べます。空だと(゚Д゚#)ゴールァ!!と怒ります。


min_length -最低文字数を指定します。形式はmin_length[文字数]という形式で記述します。最低以下だと(゚Д゚#)ゴールァ!!と怒ります。


max_length -最大文字数を指定します。形式はmax_length[文字数]という形式で記述します。最大を超えると(゚Д゚#)ゴールァ!!と怒ります。


alpha -半角アルファベットの入力かどうか調べます。それ以外だと(゚ω゚)オコトワリされます。

alpha_numeric -半角英数字の入力かどうかを調べます。それ以外だと(゚ω゚)オコトワリされます。

numeric -数値かどうか調べます。それ以外だと(゚ω゚)オコトワリされます。

integer -整数かどうか調べます。それ以外だと(゚ω゚)オコトワリされます。

valid_email -電子メールアドレスの形式かどうか調べます。それ以外だと(゚ω゚)オコトワリされます。

valid_ip -正しいIPアドレスの形式かどうかを調べます。それ以外だと(゚ω゚)オコトワリされます。


次。ルールの設定の適用。
$this->validation->set_rules($rules);
この行は実際に設定したルールをオブジェクトへ適用する部分です。
set_ruleメソッドで先ほど作成したルールの配列を引数に渡します。ここまででバリデーションのルールの設定は完了です。

あとは実際に設定されたバリデーションのルールに基づいてバリデーションが行われればOKです。

if($this->validation->run())以下で実際にバリデーションが発動。
このrun()が実際にバリデーションを行い、もし真ならifの処理を行い、偽ならエラー処理(エラー出力処理)を実行します。
偽ならばチェックで失敗しているので再度フォームを出力します。
その際に$validation->error_stringにエラー内容が渡され、フォーム上部に実際にエラーが出力されるわけです。



PHP2009-45

                  ___
                 ./    \
                 .| ^   ^ |
                 | .>ノ(、_, )ヽ、.| <とうとう私を怒らせてしまったな
                __! ! -=ニ=- ノ!__
         ,,.ィ'''フ''''=、r'"~ ヽ`ニニ´/i,, `ヽr''"`ヽ、ヽ、
       ,r'"´ ノ"    )=、 ̄ ̄,,..ィ'"´i       ヽ、
       (       ノ  ´ ̄ `Y"´            i
         )     __,,..         レ      _,,,,、       j、、
      r''ヽ. ,.ィ'''i"        J   ,,.ィ'"~  `'ヲ''ー-、ノ、 ヽ、
     / ,,.イ')'"  人        ,,l、        ノt   ) `ヽヽ
    /   /   / `ゝ、       人       ,,イ  jt、 ヽ    i
   f ,   ノ   /、   `ー--;::-ニ"_,ゝ=---‐''"    ノ ヽ、 ヽ  t、、
   )'  f   ノ ヽ、 r  、 f"   `i´ ̄` Y  `ヽ /   ゝ-,ヲ'''   )
.   ( ,.ィ''ーr"~    ヽj  ミi      !    j'   | /       ,r"    ft
   ノ、,ノ   ヽ,     `i  、〉、.__,人,___,..イ、,i" j''       (   ,ノ j
  ( t、    l      i  ヽf     Y    ,j,.  ,/      ) ,.イ´ ノ
  fヽ ヽ、   l      l ヽ、    .|   ノ ,. /     ,.イ '"ノ   ノ
  t i   l、.  t      l  、j`ー‐‐'`ー="レ' j'     // / ,/
  ヽ、 i、   i      l  ヽ  -ニ-  ノ  l     /,,,,ノ ,ィ/
    ヽ、`i  `i、     l   `i     /  ,l    /-,=、ヽv
′   ヽ ヽ、 'i,     人  ヽ    /   ノヽ   ノ''"Y,..ト-、
      `i、,,..=,i、   / ヽ、       /=ィ''i'i''j"  .`=(i-/、
       ヽ ,f`i-、   /   ヽ      /.`ー=''''"t.___  (,,ノ=、
       r-l =f,,ノゝ-''`=''フ  i、:' " ゛ ` ,i' :.    .l、  `ー=''=t_,i



(゚Д゚;)!!

GYAAAAAAAAA!!!




             -‐ '´ ̄ ̄`ヽ、
             / /" `ヽ ヽ  \
         //, '/     ヽハ  、 ヽ
         〃 {_{ノ    `ヽリ| l │ i|
         レ!小l●    ● 从 |、i|
          ヽ|l⊃ 、_,、_, ⊂⊃ |ノ│
        /⌒ヽ__|ヘ   ゝ._)   j /⌒i ! にょろーん
      \ /:::::| l>,、 __, イァ/  /│ 中の人が再生するまで代打するにょろ!
.        /:::::/| | ヾ:::|三/::{ヘ、__∧ |
       `ヽ< | |  ヾ∨:::/ヾ:::彡' |



             -‐ '´ ̄ ̄`ヽ、
             / /" `ヽ ヽ  \
         //, '/     ヽハ  、 ヽ
         〃 {_{ノ    `ヽリ| l │ i|
         レ!小l●    ● 从 |、i|
          ヽ|l⊃ 、_,、_, ⊂⊃ |ノ│   中の人が言ってたように
        /⌒ヽ__|ヘ   ゝ._)   j /⌒i !  エラーメッセージは
      \ /:::::| l>,、 __, イァ/  /│ デフォルトだと英語のみにょろ。
.        /:::::/| | ヾ:::|三/::{ヘ、__∧ |
       `ヽ< | |  ヾ∨:::/ヾ:::彡' |



             -‐ '´ ̄ ̄`ヽ、
             / /" `ヽ ヽ  \
         //, '/     ヽハ  、 ヽ  GUY人さんなら問題ないだろうけど
         〃 {_{       リ| l.│ i|  日本人には問題にょろ
         レ!小lノ    `ヽ 从 |、i|  
          ヽ|l ●   ●  | .|ノ│ 
            |ヘ⊃ 、_,、_,⊂⊃j  | , |.l
          | /⌒l,、 __, イァト |/ | 
.          | /  /::|三/:://  ヽ |
          | |  l ヾ∨:::/ ヒ::::彡, |



               \  __  /
               _ (m) _ピコーン
                  |ミ|
               /  .`´  \
             -‐ '´ ̄ ̄`ヽ、
             / /" `ヽ ヽ  \
         //, '/     ヽハ  、 ヽ
         〃 {_{ノ    `ヽリ| l │ i| でもCodeigniterには
         レ!小l●    ● 从 |、i|  ちゃんとエラーメッセージを
          ヽ|l⊃ 、_,、_, ⊂⊃ |ノ│ 日本語化する方法があるにょろ
        /⌒ヽ__|ヘ   ゝ._)   j /⌒i !
      \ /:::::| l>,、 __, イァ/  /│
.        /:::::/| | ヾ:::|三/::{ヘ、__∧ |
       `ヽ< | |  ヾ∨:::/ヾ:::彡' |



             -‐ '´ ̄ ̄`ヽ、
         。   / /" `ヽ ヽ  \
      o   //, '/     ヽハ  、 ヽ
       ゚  〃 {_{⌒    ⌒リ| l │ i|
         レ!小l三    三 从 |、i|
          ヽ|l/// 、_,、_, ///  |ノ│  それを今から解説するにょろ
        /⌒ヽ__|ヘ   ゝ._)   j /⌒i !
      \ /:::::| l>,、 __, イァ/  /│
.        /:::::/| | ヾ:::|三/::{ヘ、__∧ |
       `ヽ< | |  ヾ∨:::/ヾ:::彡' |



          , '´ ̄ ̄` ー-、
        /   〃" `ヽ、 \
       / /  ハ/     \ハヘ
       |i │ l |リ⌒     ⌒}_}ハ
        |i | 从 ●    ● l小N ではコントローラーのaddメソッド
       |i (|ミ ⊂⊃ 、_,、_, ⊂li|ノ   ミ を以下のように修正するにょろ
       | i⌒ヽ j   (_.ノ   ノi|__/⌒)
       | ヽ  ヽx>、 __, イl |::::ヽ/.
       | ∧ 人l||l,三|:::::/l| |l||l 从
       |  l ( ⌒ ):::V::/ | ( ⌒ )


修正前helo.php add↓

function add(){

$rules = array('title'=>'required','content'=>'required');
$this->validation->set_rules($rules);
if($this->validation->run()){
$data = array(
'timestamp'=> time(),
'title'=> $this->input->post('title',true),
'content'=> $this->input->post('content',true)
);
$this->db->insert('blogs',$data);

redirect(base_url().'helo/index');

}else{
$data = array('head_title'=>'ADD BLOG','content'=>'add');
$this->load->view('layout/mylayout',$data);
}
}


修正後helo.php add↓
function add(){

$rules = array('title'=>'required','content'=>'required');
$this->validation->set_rules($rules);

$this->validation->set_message('required',"%s は必須項目です");
$this->validation->set_error_delimiters(
'<div class="error">[注意]','</div>');


if($this->validation->run()){
$data = array(
'timestamp'=> time(),
'title'=> $this->input->post('title',true),
'content'=> $this->input->post('content',true)
);
$this->db->insert('blogs',$data);

redirect(base_url().'helo/index');

}else{
$data = array('head_title'=>'ADD BLOG','content'=>'add');
$this->load->view('layout/mylayout',$data);
}
}


             -‐ '´ ̄ ̄`ヽ、
             / /" `ヽ ヽ  \
         //, '/     ヽハ  、 ヽ
         〃 {_{ノ    `ヽリ| l │ i| ちなみにmylayout.css
         レ!小l●    ● 从 |、i|  にも追記を。
          ヽ|l⊃ 、_,、_, ⊂⊃ |ノ│   にょろーん
        /⌒ヽ__|ヘ   ゝ._)   j /⌒i !
      \ /:::::| l>,、 __, イァ/  /│
.        /:::::/| | ヾ:::|三/::{ヘ、__∧ |
       `ヽ< | |  ヾ∨:::/ヾ:::彡' |


mylayout.css
.error{
color: #FF0000;
text-size: 10px;
text-weight: bold;
}



          , '´ ̄ ̄` ー-、
        /   〃" `ヽ、 \
       / /  ハ/     \ハヘ
       |i │ l |リ⌒     ⌒}_}ハ
        |i | 从 ●    ● l小N 修正が終わったら
       |i (|ミ ⊂⊃ 、_,、_, ⊂li|ノ   ミhttp://localhost/igniterapp/helo/add
       | i⌒ヽ j   (_.ノ   ノi|__/⌒) へレッツアクセス!!
       | ヽ  ヽx>、 __, イl |::::ヽ/.
       | ∧ 人l||l,三|:::::/l| |l||l 从
       |  l ( ⌒ ):::V::/ | ( ⌒ )




PHP2009-46
さっきと同じにょろ。




PHP2009-47

日本語になっているにょろ!


(゚д゚)クワッ 

はい、というわけで説明。


$this->validation->set_message('required',"%s は必須項目です。");部分。

このset_messageは引数にバリデーション名と表示メッセージをそれぞれ指定して実行します。


これにより第一引数で指定したバリデーションでエラーが発生すると第二引数のメッセージが表示されます。



この第二引数「%s は必須項目です」は%sという値が埋め込まれていますがこれは項目名に置き換わるモノで。

つまりエラー時には%s→エラーが起きた項目名になるわけです。


ただし、置き換わる項目名はformタグのname=で書いたものが使われるのでここではtitleとかcontent投下になってしまうわけす。


これでメッセージの表示は日本語化できたわけですがひと手間かけてメッセージを赤くします。


$this->validation->set_error_delimiters('<div class="error">[注意]'.'</div>');

ここで実行しているset_error_delimitersは、各エラーメッセージの前後に付加するテキストを指定するものです。


<div class="error">[注意]+エラーメッセージ+</div>となるわけです。



さてバリデーションできるようになったのはいいですが、できればエラーと共に直前の入力状態が再現されたフォームを表示して再入力を求めるほうがイイ!!ですよねー。

というわけでそういうモノに作り変えませう。

validationオブジェクトを使うことで実現できます。


まずaddメソッドを修正しませう。『controller』「helo.php」


function add(){

$rules = array('title'=>'required','content'=>'required');
$this->validation->set_rules($rules);

$this->validation->set_message('required',"%s は必須項目です");
$this->validation->set_error_delimiters(
'<div class="error">[注意]','</div>');


if($this->validation->run()){
$data = array(
'timestamp'=> time(),
'title'=> $this->input->post('title',true),
'content'=> $this->input->post('content',true)
);
$this->db->insert('blogs',$data);

redirect(base_url().'helo/index');

}else{
$data = array('head_title'=>'ADD BLOG','content'=>'add');
$this->load->view('layout/mylayout',$data);
}
}

を↓のように修正。

function add(){

$rules = array('title'=>'required','content'=>'required');
$this->validation->set_rules($rules);
$fields = array('title'=>'タイトル','content'=>'コンテンツ');
$this->validation->set_fields($fields);
$this->validation->set_message('required',"%s は必須項目です");
$this->validation->set_error_delimiters(
'<div class="error">[注意]','</div>');


if($this->validation->run()){
$data = array(
'timestamp'=> time(),
'title'=> $this->input->post('title',true),
'content'=> $this->input->post('content',true)
);
$this->db->insert('blogs',$data);

redirect(base_url().'helo/index');

}else{
$data = array('head_title'=>'ADD BLOG','content'=>'add');
$this->load->view('layout/mylayout',$data);
}

}


$fields = array('title'=>'タイトル','content'=>'コンテンツ');

$this->validation->set_fields($fields);

で各フィールド名を日本語のフィールド名で名づけてます。これによりエラー時に表示される項目名が日本語になります。


つぎにビュー部分の修正。「add.php」をしゅうせいしませう。

<h1>Blog新規作成</h1>
<p>新しい記事を記述してください。</p>
<?=$this->load->library('validation') ?>
<?=$this->validation->error_string ?>
<form method="POST" action="/igniterapp/helo/add">
<table>
<tr>
<th>タイトル</th>
<td><input type="text" name="title" size="60"></td>
</tr>
<tr>
<th>コンテンツ</th>
<td><textarea name="content" cols="40" rows="3"></textarea></td>
</tr>
<tr>
<th></th>
<td><input type="submit"></td>
</tr>
</table>
</form>


↑を↓のように修正。

<h1>Blog新規作成</h1>
<p>新しい記事を記述してください。</p>

<?=$this->load->library('validation') ?>
<?=$this->validation->error_string ?>
<form method="POST" action="/igniterapp/helo/add">
<table>
<tr>
<th>タイトル</th>
<td><input type="text" name="title" size="60" value="<?=$this->validation->title ?>"></td>
</tr>
<tr>
<th>コンテンツ</th>
<td><textarea name="content" cols="40" rows="3"><?=$this->validation->content ?></textarea></td>
</tr>
<tr>
<th></th>
<td><input type="submit"></td>
</tr>
</table>
</form>



(゚д゚)こうすることでフォームへ前回入力されたデータが保管されたバリデーション変数が呼び出され、前科の入力内容が保持された状態でエラーメッセージを表示するようになります。


PHP2009-46
試しにこんてんつだけ入力。




PHP2009-48

(゚д゚)そしてクエリ押下。



PHP2009-49
タイトルねぇYO!(゚Д゚#)ゴールァ!!と怒られる。



PHP2009-50
今度は何も入力せずにクエリ送信。



PHP2009-51
両方ねぇYO!って怒られますた。


さーてエラーの日本語化も入力した内容の維持も終わり、とりあえずバリデーション編終了です。


(゚Д゚;)なんとか0時前には間に合った…。


ラスト『ヘルパー』編。次回でCodeigniterはひとまず完結となります。(´Д`;)思ったよりも時間かかったorz


(゚д゚)まぁ『フレームワークって大体こんな感じ』ってのを体感していただければそれでおkな気もするのでまぁよしとしませうか。CakePHPかそれともその前に軽くsmartyか…(´Д`;)近いうちに決めておきますorz


( ゚ω゚)ノシ TO BE CONTINUED!!

人気ブログランキングへ