Phalconで日付の比較バリデーションの方法をメモ。
開始日と終了日を入力するフォームがあった場合、開始日が終了日よりも後ろの日付にもしくは、終了日が開始日よりも前の日付になっていないかバリデーション。
ちなみに今回試したPhalconのバージョンはPhalcon5。
Phalconで日付の比較バリデーション
以下は、終了日のフォームにCallbackバリデーションを使用して実現しています。
開始日のフォームでバリデーションしてもOK。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | use \Phalcon\Filter\Validation\Validator\Callback; $endDate = new Date ( 'end_date' ); $endDate ->setLabel( '終了日' ); $endDate ->addValidators([ new DateValidator([ 'format' => 'Y-m-d' , 'message' => '終了日に日付を入力してください。' ]), new Callback([ 'callback' => function ( $data ) { if ( $data [ 'start_date' ] && $data [ 'end_date' ]) { if ( strtotime ( $data [ 'start_date' ]) > strtotime ( $data [ 'end_date' ])) { return false; } } return true; }, 'message' => '終了日は、開始日以降の日付を入力してください。' ]) ]); $this ->add( $endDate ); |
バリデーションの解説
1 | new Callback([ |
Callbackバリデーションを定義しています。
1 | 'callback' => function ( $data ) { |
$dataには送信されてきたFormデータがArrayで入っています。。
1 2 3 4 5 6 | if ( $data [ 'start_date' ] && $data [ 'end_date' ]) { if ( strtotime ( $data [ 'start_date' ]) > strtotime ( $data [ 'end_date' ])) { return false; } } return true; |
$data['start_date']が開始日(Y-m-d形式)、$data['end_date']が終了日(Y-m-d形式)。
strtotimeして日付を比較。
バリデーションエラーの場合に「return false」、バリデーションOKの場合は「return true」。