Bug(バグ) #3453
Youichi Kimura さんがほぼ8年前に更新
h3. Overview (現象) 管理画面で「Web 全体への年齢公開許可設定」を「メンバーの設定を許可しない」に設定している状態であっても、新規登録時のプロフィール入力画面では年齢の公開範囲に「Web全体に公開」の選択肢が表示され選択できてしまう。 h3. Causes (原因) 管理画面の「Web 全体への年齢公開許可設定」で設定された値は、@MemberConfigPublicFlagForm::__construct()@ で使用されている。 ここでは「Web 全体への年齢公開許可設定」が「メンバーの設定を許可しない」にセットされていた場合、「年齢の公開範囲」の選択肢から「Web 全体に公開」を除去している。 source:lib/form/MemberConfigForm/MemberConfigPublicFlagForm.class.php@20d13f4#L31: <pre><code class="php"> if (!opConfig::get('is_allow_web_public_flag_age')) { $widget = $this->widgetSchema['age_public_flag']; $choices = $widget->getOption('choices'); unset($choices[4]); $widget->setOption('choices', $choices); $this->validatorSchema['age_public_flag']->setOption('choices', array_keys($choices)); } </code></pre> しかし、 *新規登録時* のフォームでは MemberConfigPublicFlagForm などの MemberConfigForm 派生クラスは使用されず MemberConfigForm のインスタンスが直接使用されるため、@MemberConfigPublicFlagForm::__construct()@ が呼ばれることはない。 そのため、「Web 全体への年齢公開許可設定」の設定値を考慮することなく @MemberConfigForm::generateConfigWidgets()@ によってウィジェットが追加される。 h3. Way to fix (修正内容) 「Web 全体に公開」の選択肢の除去を @MemberConfigForm::setMemberConfigSettings()@ メソッドに移動する。 修正内容を記入 このメソッドは、新規登録画面 (MemberConfigForm インスタンスが使われる) および設定変更画面 (MemberConfigForm 派生クラスのインスタンスが使われる) で共通して使用されるため、これらの画面による選択肢の差異が生じなくなる。