aswww log

エンジニアの技術録。アプリとかウェブとか

fuelPHP1.6くらいで日付Validation関数独自実装

fuelPHPにて入力チェックの機構として以下のValidationクラスがある。

Validation Class

数値チェックや長さチェックは以下のとおりできる。

$validation = Validation::forge();
$validation->add('id', 'ID')
           ->add_rule('valid_string', 'numeric')
           ->add_rule('max_length', 11);

日付に関しても'valid_date'というものが用意されているのだが、これが何故かうまくいかず、常にエラーになってしまう。

//うまくいかない例
$validation->add('date', '日付')
           ->add_rule('valid_date', 'YYMMDD');

引数の日付型の指定が違うのかと色々調べたが、原因わからず。Validationなら調べるよりも独自で実装したほうが解決が早いと考え、独自実装することにした。


まず、fuel/app/classes/myvalidation.phpに以下のとおり実装する。ちなみに日付はyyyymmdd形式(例:20131126)で渡される想定。

<?php
class MyValidation
{
    //yyyymmdd形式の数値が$dateに入る
    public static function _validation_date_yyyymmdd($date)
    {
	if(!empty($date) && ctype_digit($date)){
	    if(checkdate(substr($date, 4, 2), substr($date, 6, 2), substr($date, 0, 4))){
			return true;
	    }
        }
	Validation::active()->set_message('date', ':label が不正です');
	return false;
    }
}

checkdateは日付を正確にチェックしてくれる。
それでコントローラーを以下のとおり実装する。

$validation = Validation::forge();
$validation->add_callable('myvalidation');   //myvalidation.phpを使用する
$validation->add('date', '日付')
           ->add_rule('date_yyyymmdd');      //独自関数指定

これで実装完了。ちゃんと20160229を指定するとtrueに、20150229を指定するとfalseが返ってくる。完成。
検索で出てこない時は独自で実装しちゃったほうがいいこともあるのね。