バリデーションで日付を比較する独自メソッド
CakePHP1.2には便利なバリデーションが組み込まれていますが、そのままではかゆい所に手が届きません。
例えば、今日からx日以降の日付を入力してほしい場合など。
今日は、日付に関する比較をなるべく汎用的に使えるようにバリデーションメソッドを書いてみました。
具体的には、以下のメソッドをAppModelに書き加えます。
/** * 日付を比較するバリデーションルール. * デフォルトでは、現在の日付と対象の日付を比較演算子の通りに比較する. * 現在の日付との差分がある場合、その分だけずらした日付と対象の日付を比較する. * 比較演算子は、Validation::comparisonと同じものが使える. * 現在の日付との差分は、strtotime()でtimestampで変換可能な文字列. * @param string $check1 比較対象の日付 * @param string $operator 比較演算子 * @param string $timestamp 現在の日付との差分 */ function comparisonDate($check1, $operator, $timestamp = null) { $check1 = is_array($check1) ? array_shift($check1) : $check1; $check2 = !empty($timestamp) ? date("Y/m/d") : $date("Y/m/d", strtotime($timestamp)); $operator = str_replace(array(' ', "\t", "\n", "\r", "\0", "\x0B"), '', strtolower($operator)); switch ($operator) { case 'isgreater': case '>': if ($check1 > $check2) { return true; } break; case 'isless': case '<': if ($check1 < $check2) { return true; } break; case 'greaterorequal': case '>=': if ($check1 >= $check2) { return true; } break; case 'lessorequal': case '<=': if ($check1 <= $check2) { return true; } break; case 'equalto': case '==': if ($check1 == $check2) { return true; } break; case 'notequal': case '!=': if ($check1 != $check2) { return true; } break; default: $_this =& Validation::getInstance(); $_this->errors[] = __('You must define the $operator parameter for AppModel::comparisonDate()', true); break; } return false; }
モデル側で使用する場合は、以下のように記述します。
$validate = array( //今日以降の日付 "date" => array( "rule" => array("comparisonDate", "<="), "message" => "今日以降の日付を入力してください。" ), //今日-10日以前の日付 "date" => array( "rule" => array("comparisonDate", ">", "-10days"), "message" => "10日以上前の日付を入力してください。" ) );
一応、それなりの配慮はしたつもりですが、実際に使用する際はくれぐれもお気をつけくださいませ。
また、「中二か!」的なツッコミお待ちしております。