Enhancement(機能追加・改善) #2275
完了opValidatorDate の date_format_range_error が直書きされているので option で変更できるようにする
100%
説明
背景¶
#754 では opValidatorDate で配列でない入力値に対しての下限・上限のバリデートがされていない問題が修正されていますが、そこではバリデートに引っかかった場合に出力するエラーメッセージに用いる日付のフォーマットが直に書かれています。
opValidatorDate クラスでは、許容範囲外の日付が入力された場合のエラーメッセージのフォーマットに 'Y-m-d' を用いるという仕様であっても良いとは思いますが、そうであっても不用意に拡張性を低下させないようにしたほうが好ましい思います。
- (1) 例外時のフォーマットは $this->getOption('date_format_range_error') を用いるようにする
- (2) opValidatorDate クラスでこのデフォルト値を 'Y-m-d' とすべきだと考えるのであれば、 $this->getOption('date_format_range_error') のデフォルト値をこのクラス内で 'Y-m-d' にセットする
#754 の修正内容を含めて考察しましたが、(2) の必要性は特に見当たらないので (1) のみ対応します(デフォルト値は sfValidatorDate と同様になります。関連 #1630 )。
概要¶
メンバー側のプロフィール入力ページでは、日付のプロフィール項目は opValidatorDate を用いている。
管理画面でのプロフィール項目設定で指定された最小値や最大値を超える日付を入力した場合などにはエラーメッセージが表示されるが、そこで併せて表示される日付のフォーマットは opValidatorDate を使う限り 'Y-m-d' に固定されてしまっている。
修正方針¶
opValidatorDate のインスタンスを生成する時点で設定できる $option には、この範囲エラー時の日付フォーマットを指定するための date_format_range_error オプションが用意されている。これを opValidatorDate 内で用いるようにし、日付のフォーマットは opValidatorDate のインスタンスを生成する時点で指定できるようにする。
修正内容¶
lib/util/opFormItemGenerator.class.php @@ -233,6 +233,7 @@ class opFormItemGenerator if ($field['FormType'] === 'date') { + $option['date_format_range_error'] = 'Y-m-d'; $obj = new opValidatorDate($option); return $obj; }
lib/validator/opValidatorDate.class.php @@ -56,7 +56,7 @@ class opValidatorDate extends sfValidatorDate $max = new DateTime($this->getOption('max')); if ($max && $clean->format('U') > $max->format('U')) { - throw new sfValidatorError($this, 'max', array('max' => $max->format('Y-m-d'))); + throw new sfValidatorError($this, 'max', array('max' => $max->format($this->getOption('date_format_range_error')))); } } @@ -65,7 +65,7 @@ class opValidatorDate extends sfValidatorDate $min = new DateTime($this->getOption('min')); if ($min && $clean->format('U') < $min->format('U')) { - throw new sfValidatorError($this, 'min', array('min' => $min->format('Y-m-d'))); + throw new sfValidatorError($this, 'min', array('min' => $min->format($this->getOption('date_format_range_error')))); } }
補足¶
date_format_range_error については http://www.symfony-project.org/forms/1_4/ja/B-Validators にも記述されている。