Bug(バグ) #3453
完了管理画面で「Web 全体への年齢公開許可設定」を「メンバーの設定を許可しない」に設定しても新規登録時には選択できてしまう
0%
説明
Overview (現象)¶
管理画面で「Web 全体への年齢公開許可設定」を「メンバーの設定を許可しない」に設定している状態であっても、新規登録時のプロフィール入力画面では年齢の公開範囲に「Web全体に公開」の選択肢が表示され選択できてしまう。
Causes (原因)¶
管理画面の「Web 全体への年齢公開許可設定」で設定された値は、MemberConfigPublicFlagForm::__construct()
で使用されている。
ここでは「Web 全体への年齢公開許可設定」が「メンバーの設定を許可しない」にセットされていた場合、「年齢の公開範囲」の選択肢から「Web 全体に公開」を除去している。
source:lib/form/MemberConfigForm/MemberConfigPublicFlagForm.class.php@20d13f4#L31:
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));
}
しかし、 新規登録時 のフォームでは MemberConfigPublicFlagForm などの MemberConfigForm 派生クラスは使用されず MemberConfigForm のインスタンスが直接使用されるため、MemberConfigPublicFlagForm::__construct()
が呼ばれることはない。
そのため、「Web 全体への年齢公開許可設定」の設定値を考慮することなく MemberConfigForm::generateConfigWidgets()
によってウィジェットが追加される。
Way to fix (修正内容)¶
「Web 全体に公開」の選択肢の除去を MemberConfigForm::setMemberConfigSettings()
メソッドに移動する。
このメソッドは、新規登録画面 (MemberConfigForm インスタンスが使われる) および設定変更画面 (MemberConfigForm 派生クラスのインスタンスが使われる) で共通して使用されるため、これらの画面による選択肢の差異が生じなくなる。