Project

General

Profile

Bug(バグ) #3453

Updated by Youichi Kimura over 3 years ago

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 派生クラスのインスタンスが使われる) で共通して使用されるため、これらの画面による選択肢の差異が生じなくなる。

Back