Bug(バグ) #1937
完了日付のプロフィール項目で、管理画面で指定した上限の日が弾かれてしまう
100%
説明
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 にセットするか、それに相当する記述に書き換える。
Masato Nagasawa さんが13年以上前に更新
- ステータス を New(新規) から Invalid(無効) に変更
#940 で時刻を設定できなくする対応を行っているため、このチケットは閉じます。
Masato Nagasawa さんが13年以上前に更新
- ステータス を Invalid(無効) から New(新規) に変更
#940 のチケットが完了次第こちらのチケットを閉じる方向で。
ひとまずこのチケットを再オープンしておきます。
Minoru Takai さんが13年以上前に更新
このチケットが作成された時点でのチケット内容を残しておきます。
日付のプロフィール項目で、管理画面で時刻を設定している場合に最小値、最大値で登録できてしまう¶
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 (修正内容)¶
修正内容を記入
Minoru Takai さんが13年以上前に更新
- 題名 を 日付のプロフィール項目で、管理画面で時刻を設定している場合に最小値、最大値で登録できてしまう から 日付のプロフィール項目で、管理画面で指定した上限の日が弾かれてしまう に変更
- 担当者 を Minoru Takai にセット
- 対象バージョン を OpenPNE 3.7.0 にセット
- 3.6 で発生するか を Yes にセット
このチケットでは、
プロフィール登録の際の判定時に、どうやら現在時刻として判定しているようです。
最小値、最大値で設定した日付は設定できないのが正しい挙動です。
とだけ示されていますが、何が適切な仕様であり、現状の動作がどのような問題であるのかよく分かりません(下限・上限として「設定した日付は設定できないのが正しい挙動」とは一体どういうことか)。
チケットを書き換えます。
Minoru Takai さんが13年以上前に更新
- ステータス を New(新規) から Pending Review(レビュー待ち) に変更
- 進捗率 を 0 から 50 に変更
更新履歴 c446e5dcf47544022c4ce36df22edb174912c68e で適用されました。
Kousuke Ebihara さんが約13年前に更新
- ステータス を Pending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
- 進捗率 を 50 から 70 に変更
Shouta Kashiwagi さんが12年以上前に更新
- 3.6 で発生するか を Yes から Unknown (未調査) に変更
- 3.4 で発生するか を 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
Yuma Sakata さんが12年以上前に更新
- ステータス を Pending Testing(テスト待ち) から Fixed(完了) に変更
- 進捗率 を 70 から 100 に変更
テストOKです。