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 にも記述されている。
Minoru Takai さんが13年以上前に更新
- ステータス を Accepted(着手) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 b6045142184085971062775555cf48d3db34de56 で適用されました。
Yuya Watanabe さんが12年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Rejected(差し戻し) に変更
- 担当者 を Minoru Takai から Youichi Kimura に変更
修正内容自体は問題ないですが,lib/util/opFormItemGenerator.class.php でのコーディング規約違反があるので修正をお願いします.
Minoru Takai さんが12年以上前に更新
Yuya Watanabe は書きました:
修正内容自体は問題ないですが,lib/util/opFormItemGenerator.class.php でのコーディング規約違反があるので修正をお願いします.
具体的にどのような点で規約違反があるのかを指摘してください。修正すべき箇所が不明です。
Yuya Watanabe さんが12年以上前に更新
変数と値を比較する際に最初に値を置いていない.
lib/util/opFormItemGenerator.class.php 74 行目
72 if (in_array($field['FormType'], self::$choicesType)) 73 { 74 if ($field['FormType'] === 'select') 75 { 76 if (!$field['IsRequired']) 77 { ... 167 } 168 169 if ($field['FormType'] === 'checkbox') 170 { 171 $option['choices'] = $choices; ... 174 return $obj; 175 } 176 if ($field['FormType'] === 'select' || $field['FormType'] === 'radio') 177 { 178 $option = array('choices' => $choices); ... 182 } 183 184 if ($field['ValueType'] === 'integer') 185 { 186 if (isset($field['ValueMin']) && is_numeric($field['ValueMin'])) ... 198 } 199 } 200 elseif ($field['FormType'] === 'date') 201 { 202 if (isset($field['ValueMin']) && false !== strtotime($field['ValueMin'])) ... 232 } 233 234 if ($field['FormType'] === 'date') 235 { 236 $option['date_format_range_error'] = 'Y-m-d'; ...
return 文の直前には可読性向上のために空行を入れるべき.
172 $option['multiple'] = true; 173 $obj = new sfValidatorChoice($option); 174 return $obj; 175 } 176 if ($field['FormType'] === 'select' || $field['FormType'] === 'radio') ... 179 $option['required'] = $field['IsRequired']; 180 $obj = new sfValidatorChoice($option); 181 return $obj; 182 } 183 184 if ($field['ValueType'] === 'integer') ... 236 $option['date_format_range_error'] = 'Y-m-d'; 237 $obj = new opValidatorDate($option); 238 return $obj; 239 } 240 ...
Yuya Watanabe さんが12年以上前に更新
コーディング規約には記述されていませんが,個人的に気になるものとして switch 文の default ラベル部分に break が書かれていないというものがあります.これについては修正不要と思います.一般的にはどうなんでしょうね.
150 $obj = new sfWidgetFormChoice(array('choices' => $list)); 151 break; 152 default: 153 $obj = new sfWidgetFormInput($params); 154 } ... 270 break; 271 default: 272 $obj = new opValidatorString($option); 273 } 274 ... 334 // text and something else 335 default: 336 $obj = new sfWidgetFormInput($params); 337 } 338
Youichi Kimura さんが12年以上前に更新
- ステータス を Rejected(差し戻し) から Pending Review(レビュー待ち) に変更
更新履歴 2bf278a5802ae85a329d9649be5c8a1a84e91d07 で適用されました。
Youichi Kimura さんが12年以上前に更新
当チケットでの変更範囲外ですが 2bf278a5802ae85a329d9649be5c8a1a84e91d07 にてnote-7,8の指摘箇所を修正しました。
Yuya Watanabe さんが12年以上前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
Yuma Sakata さんが12年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更
テストOKです。