プロジェクト

全般

プロフィール

Bug(バグ) #1449

完了

opFormItemGenerator::generateValidator() の 数値用バリデータ生成時 ValueMax, ValueMin が 0の場合は 範囲指定されない

Shogo Kawahara さんが14年以上前に追加. 約7年前に更新.

ステータス:
Fixed(完了)
優先度:
Normal(通常)
担当者:
対象バージョン:
開始日:
2010-07-28
期日:
進捗率:

100%

予定工数:
3.6 で発生するか:
Yes
3.8 で発生するか:
Unknown (未調査)

説明

Overview

opFormItemGenerator::generateValidator() の 数値用バリデータ生成時 ValueMax, ValueMin が 0の場合は 範囲指定されない


再現手順

  • 範囲が 0 〜 1 である数値プロフィール項目を作成。
  • プロフィール編集で -1 を入力
  • 正常にプロフィールが登録できてしまう。

対象

OpenPNE3.0.x 〜 OpenPNE3.7.x-dev

Causes

184     if ($field['ValueType'] === 'integer' || $field['FormType'] === 'date')
185     {   
186         if (!empty($field['ValueMin']))
187         {
188           $option['min'] = $field['ValueMin'];
189         }
190         if (!empty($field['ValueMax']))
191         {
192           $option['max'] = $field['ValueMax'];
193         }
194     } 

ValueMinおよびValueMax を empty() を利用して判定しているためです。

Way to fix


関連するチケット 6 (1件未完了5件完了)

関連している OpenPNE 3 - Bug(バグ) #837: プロフィール項目設定の文字数制限でmax=0,min=0と設定できてしまうFixed(完了)Minoru Takai2010-03-11

操作
関連している OpenPNE 3 - Backport(バックポート) #1468: opFormItemGenerator::generateValidator() の 数値用バリデータ生成時 ValueMax, ValueMin が 0の場合は 範囲指定されないFixed(完了)tu nguyen ngoc2010-07-28

操作
関連している OpenPNE 3 - Backport(バックポート) #1469: opFormItemGenerator::generateValidator() の 数値用バリデータ生成時 ValueMax, ValueMin が 0の場合は 範囲指定されないFixed(完了)Shinichi Urabe2010-07-28

操作
関連している OpenPNE 3 - Backport(バックポート) #1470: opFormItemGenerator::generateValidator() の 数値用バリデータ生成時 ValueMax, ValueMin が 0の場合は 範囲指定されないWon't fix(対応せず)2010-07-28

操作
関連している OpenPNE 3 - Bug(バグ) #1478: OpenPNE2コンバーターでc_profileのval_maxおよびval_minの仕様の違いを吸収できていないFixed(完了)Shogo Kawahara2010-08-04

操作
関連している OpenPNE 3 - Bug(バグ) #940: プロフィール項目の日付やテキストの最小値を最大値より大きくして設定できてしまうPending Fixing(修正待ち)2010-04-05

操作

Shogo Kawahara さんが14年以上前に更新

  • 担当者Shogo Kawahara にセット

Shogo Kawahara さんが14年以上前に更新

  • ステータスNew(新規) から Pending Review(レビュー待ち) に変更
  • 進捗率0 から 50 に変更

更新履歴 b7c64b5705ffb2c44d5e3c99617d4270ede9f3a5 で適用されました。

Minoru Takai さんが14年以上前に更新

本件には直接関係しませんが、気になったのでコメントしておきます。

MemberProfileForm.class.php の 56〜74 行目ですが、現在次のように書かれています。

      if (!$memberProfile)
      {
        if (null === $value['value'])
        {
          continue;
        }
        $memberProfile = new MemberProfile();
        $memberProfile->setMemberId($memberId);
        $memberProfile->setProfileId($profile->getId());
      }
      elseif (null === $value['value'])
      {
        if ($profile->isMultipleSelect())
        {
          $memberProfile->clearChildren();
        }
        $memberProfile->delete();
        continue;
      }

この部分は次のように記述した方が読みやすいかもしれません。

      if (null === $value['value'])
      {
        if ($memberProfile)
        {
          if ($profile->isMultipleSelect())
          {
            $memberProfile->clearChildren();
          }
          $memberProfile->delete();
        }
        continue;
      }
      if (!$memberProfile)
      {
        $memberProfile = new MemberProfile();
        $memberProfile->setMemberId($memberId);
        $memberProfile->setProfileId($profile->getId());
      }

Shogo Kawahara さんが14年以上前に更新

  • ステータスPending Review(レビュー待ち) から Accepted(着手) に変更

takai 差戻し扱いとします

Minoru Takai さんが14年以上前に更新

0を含む制限値の範囲指定ができるように修正されていますが、 #837 で対応したような、仮に (min, max) = (8, 4) のような大小関係が不正な場合に制限をしないとった対応がされていません。

また、2系のバリデータは (0, 0) が (制限なし) を意味していましたが、3系のバリデータは範囲制限を行ないます。そこで、(0, 0) を例外的に制限なしと見なすような仕様にするかを検討する必要があります。この問題の抜本的な解決方法はコンバータを改良することです(2系からのコンバート時に(0, 0)のものを(NULL, NULL)として保存するようにする)。

(0, 0) 問題について #837 ではこの範囲制限は文字列長を意味し、空文字を入力した場合は「0文字長のテキストを入力した」のではなく「入力を省略した」と見なされる仕様を理由に、(0, 0) を (NULL, NULL) と見なすような例外処理を加えていますが、数値範囲の場合は (0, 0) は即ち整数 0 のみを受け付ける制約として意味があるので (NULL, NULL) と見なしてよいか検討する必要があります。

上記3段落の内容をまとめると、

  • (1) (min, max) = (8, 4) の範囲指定がされたままコンバートされると、不正な制約のせいで入力できなくなるので、(NULL, NULL) と見なすように修正しよう
  • (2) 範囲指定がされていないままコンバートされると、(0, 0)という制約が付いてしまうので、コンバータの仕様を改善しよう
  • (3) コンバータの仕様を直さないのであれば、コンバート後の (0, 0) が (NULL, NULL) を意味するようなバリデータの仕様を変更してよいか検討しよう(バリデータの仕様を変更する場合、管理画面から(min, max)を指定する際に(0, 0)が指定できるが、それが範囲指定なしを意味することになるので管理画面にも注意書きが必要になる)

ということになります。

Shogo Kawahara さんが14年以上前に更新

to takai

  • (1) (min, max) = (8, 4) の範囲指定がされたままコンバートされると、不正な制約のせいで入力できなくなるので、(NULL, NULL) と見なすように修正しよう
  • (2) 範囲指定がされていないままコンバートされると、(0, 0)という制約が付いてしまうので、コンバータの仕様を改善しよう
  • (3) コンバータの仕様を直さないのであれば、コンバート後の (0, 0) が (NULL, NULL) を意味するようなバリデータの仕様を変更してよいか検討しよう(バリデータの仕様を変更する場合、管理画面から(min, max)を指定する際に(0, 0)が指定できるが、それが範囲指定なしを意味することになるので管理画面にも注意書きが必要になる)
  • (1)の件は修正します。

コンバーターの仕様を見直す方向に持って行こうと考えていますが、本件とはまたトピックが異なるため別チケットとします。

Shogo Kawahara さんが14年以上前に更新

  • ステータスAccepted(着手) から Pending Review(レビュー待ち) に変更

更新履歴 08f072dc491468f3f8c5dae03c6e6b5094c0de5f で適用されました。

Shogo Kawahara さんが14年以上前に更新

  • ステータスPending Review(レビュー待ち) から Rejected(差し戻し) に変更

Shogo Kawahara さんが14年以上前に更新

  • ステータスRejected(差し戻し) から Pending Review(レビュー待ち) に変更

更新履歴 0bc23d2c278dd23948d97ca6186522bfac7ba7bb で適用されました。

Rimpei Ogawa さんが14年以上前に更新

  • 3.6 で発生するかYes にセット

Kousuke Ebihara さんが14年以上前に更新

  • ステータスPending Review(レビュー待ち) から Pending Testing(テスト待ち) に変更
  • 進捗率50 から 70 に変更

問題ありません。

このチケットの確認中に now などの文字列が実際の日付に変換された上で DB に保存されてしまっているというバグを発見しました。これは実際には文字列として保存しておき、その文字列をバリデーションのために都度日付に直すのが正しい挙動です。このバグは #9304e1f2665 の変更により混入したものと思われます。

このチケットでは日付の比較にも関わる変更がなされているので微妙なところですが、別のバグチケットを切って対処することにしましょう。

Kousuke Ebihara さんが14年以上前に更新

Kousuke Ebihara は書きました:

問題ありません。

このチケットの確認中に now などの文字列が実際の日付に変換された上で DB に保存されてしまっているというバグを発見しました。これは実際には文字列として保存しておき、その文字列をバリデーションのために都度日付に直すのが正しい挙動です。このバグは #9304e1f2665 の変更により混入したものと思われます。

このチケットでは日付の比較にも関わる変更がなされているので微妙なところですが、別のバグチケットを切って対処することにしましょう。

この件についてのチケットを作成しました。 http://redmine.openpne.jp/issues/1595

Yuma Sakata さんが約13年前に更新

  • ステータスPending Testing(テスト待ち) から Fixed(完了) に変更
  • 進捗率70 から 100 に変更

テストOKです。

Chiharu Nakajima さんが約7年前に更新

3.6対応済み( #1468 )
3.8発生せず

他の形式にエクスポート: Atom PDF