操作
Bug(バグ) #1937
完了日付のプロフィール項目で、管理画面で指定した上限の日が弾かれてしまう
開始日:
期日:
進捗率:
100%
予定工数:
(合計: 0:00時間)
3.6 で発生するか:
Unknown (未調査)
3.8 で発生するか:
Unknown (未調査)
説明
Overview (現象)¶
日付のプロフィール項目があり、管理画面で下限上限を指定しているとき、下限の日はメンバーが設定できるのに対し、上限の日はメンバーが設定できない。
例えば、管理画面で日付型のプロフィール項目を作り、下限上限を (2011/01/10, 2011/01/20) と設定しているとき、メンバーは 2011/01/10 を入力して設定することができるが、 2011/01/20 を入力すると「2011-01-20以前にしてください。」と弾かれてしまう。
Causes (原因)¶
- 注意:プロフィール項目周りやそのバリデータは修正が幾度か行われており、いつの実装が本来の仕様なのかについて曖昧になっている可能性がある。
#1595 修正後の master ブランチのソースで手元で確認した限り、プロフィール項目は以下のような動作になっている。
- 管理画面の日付の下限上限の値:
- sfValidatorDate で受け付けられる値がそのままDBに保存される
- "2011/01/20" という値であれば、 DateTime では "2011/01/20 00:00:00" として扱われる
- メンバーが入力した日付の値:
- プロフィールの日付型は、現状の lib/util/opFormItemGenerator.class.php の実装を見る限り、扱う情報は「年月日」のみであり、「時分秒」は入力として受け付けないような仕様となっている
- opValidatorDate で受け付けられる値となるが、その値は「現在日時に、入力された年月日をセットしたもの」となっている
- lib/validator/opValidatorDate.class.php
else { $clean = new DateTime(); $clean->setDate(intval($value['year']), intval($value['month']), intval($value['day'])); }
メンバーが "2011/01/20" を入力しても、メンバーが操作した時点の日時が Y年m月d日 18:10:50 であれば "2011/01/20 18:10:50" という値で扱われてしまい、管理画面の下限上限と比較する際に適切でない比較が行われてしまう。
結果として、管理画面から設定された上限が "2011/01/20" であれば通るはずのメンバー入力値 "2011/01/20" が、 "2011/01/20 18:10:50" として扱われるため、上限を超える日付だと判断されて弾かれている。
Way to fix (修正内容)¶
- lib/validator/opValidatorDate.class.php
else { $clean = new DateTime(); $clean->setDate(intval($value['year']), intval($value['month']), intval($value['day'])); + $clean->setTime(0, 0, 0); }
のようにメンバー入力値を扱う場合に時分秒を 0 にセットするか、それに相当する記述に書き換える。
操作