平井です。久々の投稿です。
珍しくプログラミングに関するエントリーを書きます。
村式では、EthnaというPHPフレームワークを多く活用しています。
先日Ethnaのプラグインを使って、複数のInput値をValidateする機会がありました。
具体的に書かれた情報があまり見つからなかったので、参考になればと思ってエントリーにします。
たとえば以下のように、電話番号の入力フォームを3つのテキストボックスに分けた場合を考えます。

このような時、例えば携帯電話について、
- フォームのひとつにでも値が入っていたら、他のにも入ってないとおかしい
- 携帯電話は[3桁]-[4桁]-[4桁]でしょ?
といったことをvalidateで実現したいとします。
こうした場合は、プラグインを作ってvalidateすると簡単です。
プラグインを使ったvalidate方法は、ここで説明されていますが、自分の復習も兼ねて。
プラグインの作成
プラグインファイルには命名規則があって、
[App_id]_Plugin_validator_Xxxxxx.php
という感じでファイルを作成して、
path/to/app_id/app/plugin/Validator
に置きます。
以下、プラグインファイルのソース例です。
< ?php class Hoge_Plugin_Validator_Cellphone extends Ethna_Plugin_Validator {
var $accept_array = true; // フォーム値の正規表現×3
var $regexp1 = '/^0[0-9]0$/';
var $regexp2 = '/^[0-9]{4}$/';
var $regexp3 = '/^[0-9]{4}$/';
/**
* 携帯番号のチェック
*
*/
function validate($name, $var, $params){
// フォーム値×3
$var1 = $var['1'];
$var2 = $var['2'];
$var3 = $var['3'];
// 返り値
$return = true;
// テキストボックスに一つでも値が入っていれば検証する
if($var1 != '' || $var2 != '' || $var3 != ''){
// 抜けがあったらエラー
if($var1 == '' || $var2 == '' || $var3 == ''){
$return = false;
}else{
// 正規表現
$match = preg_match($this->regexp1,$var1);
$match = $match && preg_match($this->regexp2,$var2);
$match = $match && preg_match($this->regexp3,$var3);
if(!$match){
$return = false;
}
}
}
return $return ? true : Ethna::raiseNotice('{form}を正しく入力してください', E_FORM_INVALIDVALUE);
}
}
?>
HTML
HTMLはこんな感じになります。
| 携帯電話番号 | - - |
|---|
プラグインに渡したい値のnameのつけ方がポイントですね。
フォーム定義
validate時にプラグインを使用するように定義します。
var $form = array(
'cellphone' => array(
'type' => array(VAR_TYPE_STRING),
'name' => '電話番号',
'filter'=> 'ltrim,rtrim,ntrim',
'required' => false,
'cellphone' => true,
),
);
複数の値を受け取りたいために、
'type' => array(VAR_TYPE_STRING)
を指定しています。そして、
'cellphone' => true
とすることで、プラグインを使用することをEthnaに伝えています。
この辺、詳しくはやっぱりこのあたりを参照してください。
Ethnaでは(Ethnaに限りませんが)、プラグインを使うと使い勝手がぐっとひろがります。これからもいろいろ試していこうと思います。