Bug(バグ) #1937
日付のプロフィール項目で、管理画面で指定した上限の日が弾かれてしまう
100%
Description
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 にセットするか、それに相当する記述に書き換える。
Subtasks
Related issues
Associated revisions
(fixes #1937) fixed a bug that could not set date if the date is max-date
History
#1
Updated by Masato Nagasawa almost 13 years ago
- Status changed from New(新規) to Invalid(無効)
#940 で時刻を設定できなくする対応を行っているため、このチケットは閉じます。
#2
Updated by Masato Nagasawa almost 13 years ago
- Status changed from Invalid(無効) to New(新規)
#940 のチケットが完了次第こちらのチケットを閉じる方向で。
ひとまずこのチケットを再オープンしておきます。
#3
Updated by Minoru Takai over 12 years ago
このチケットが作成された時点でのチケット内容を残しておきます。
日付のプロフィール項目で、管理画面で時刻を設定している場合に最小値、最大値で登録できてしまう¶
Overview (現象)¶
プロフィール登録の際の判定時に、どうやら現在時刻として判定しているようです。
最小値、最大値で設定した日付は設定できないのが正しい挙動です。
例¶
時刻が「2011-03-01-20:00:00」であった場合
- 最小値「2011-01-01 00:00:00」 最大値「2011-03-01 00:00:00」→通らない(2011-03-01以前にしてください。)
- 最小値「2011-01-01 00:00:00」 最大値「2011-03-01 21:00:00」→通る
Causes (原因)¶
バグが発生した原因を記入
Way to fix (修正内容)¶
修正内容を記入
#4
Updated by Minoru Takai over 12 years ago
- Subject changed from 日付のプロフィール項目で、管理画面で時刻を設定している場合に最小値、最大値で登録できてしまう to 日付のプロフィール項目で、管理画面で指定した上限の日が弾かれてしまう
- Assignee set to Minoru Takai
- Target version set to OpenPNE 3.7.0
- 3.6 で発生するか set to Yes
このチケットでは、
プロフィール登録の際の判定時に、どうやら現在時刻として判定しているようです。
最小値、最大値で設定した日付は設定できないのが正しい挙動です。
とだけ示されていますが、何が適切な仕様であり、現状の動作がどのような問題であるのかよく分かりません(下限・上限として「設定した日付は設定できないのが正しい挙動」とは一体どういうことか)。
チケットを書き換えます。
#5
Updated by Minoru Takai over 12 years ago
- Status changed from New(新規) to Pending Review(レビュー待ち)
- % Done changed from 0 to 50
更新履歴 c446e5dcf47544022c4ce36df22edb174912c68e で適用されました。
#6
Updated by Kousuke Ebihara about 12 years ago
- Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
- % Done changed from 50 to 70
#7
Updated by Shouta Kashiwagi over 11 years ago
- 3.6 で発生するか changed from Yes to Unknown (未調査)
- 3.4 で発生するか set to Unknown (未調査)
以下のようなエラーが発生しましたが、#2478 での変更がエラー発生の原因となっているので、#2478 が修正され次第ステータスをFixedにします。
・再現手順
1.プロフィール項目追加画面にアクセスする(/pc_backend.php/profile/edit) 2.フォームタイプで日付を選択する 3.最小値にlast Monday、最大値にnowを入れsubmit 4.frontendログイン後、プロフィール編集ページでアクセスする 5.管理画面で設定した範囲内の値(最小値)で設定する
・発生エラー
Fatal error: Call to a member function setValue() on a non-object in /path/to/OpenPNE3/lib/form/doctrine/MemberProfileForm.class.php on line 99
#8
Updated by Shouta Kashiwagi over 11 years ago
- Target version changed from OpenPNE 3.7.0 to 252
#9
Updated by Yuma Sakata over 11 years ago
- Target version changed from 252 to OpenPNE 3.8beta1
#10
Updated by Yuma Sakata over 11 years ago
- Status changed from Pending Testing(テスト待ち) to Fixed(完了)
- % Done changed from 70 to 100
テストOKです。
#11
Updated by kaoru n about 8 years ago
- 3.8 で発生するか set to Unknown (未調査)
#12
Updated by Chiharu Nakajima about 6 years ago
3.6未対応
3.8発生せず