Project

General

Profile

Bug(バグ) #3602

Updated by Rimpei Ogawa over 5 years ago

h3. Overview (現象)

プロフィール登録・編集フォームで、公開設定変更が可能かつ必須項目ではないプロフィール項目に対して値が空の状態で公開設定のみを変更して送信した後に、プロフィール編集フォームを開くと公開設定のデフォルト値に変更が反映されるものとされないものが混在した状態で表示されます。

値が空の場合の公開設定が保持されるかどうかは、管理画面から設定可能なプロフィール項目の種類(フォームタイプと入力値タイプ)によって変わります。

プリセット

|_. タイプ |_. 値が空の場合の公開設定 |
| 性別 | 保持されない 保持される |
| 誕生日 | 保持されない 保持される |
| 国または地域 | 保持される |
| 都道府県 | 保持される |
| 郵便番号 | 保持される |
| 電話番号 | 保持される |
| 自己紹介 | 保持される |

汎用

|_. フォームタイプ |_. 入力値タイプ |_. 値が空の場合の公開設定 |
| テキスト | 文字列 | 保持される |
| テキスト | 数値 | 保持されない |
| テキスト | メールアドレス | 保持される |
| テキスト | URL | 保持される |
| テキスト | 正規表現 | 保持される |
| テキスト(複数行) | 文字列 | 保持される |
| 単一選択(プルダウン) | - | 保持されない |
| 単一選択(ラジオボタン) | - | 保持されない |
| 複数選択(チェックボックス) | - | 保持されない |
| 日付 | - | 保持されない |

なお、プロフィールの表示に関しては、値が空の場合には公開設定が保持されるされないに関わらず非表示となるため影響がありません。

h3. Causes (原因)

値が空の場合に公開設定が保持されるものは member_profile テーブルにレコードが生成されるもの、保持されないものはレコードが生成されないものです。(メンバーの各プロフィール項目の値と公開設定値は member_profile テーブルの同一のレコード内に保存されます。)

メンバープロフィール情報の登録・編集をおこなう MemberProfileForm には、値が @NULL@ の場合に既存レコードを削除し、新しいレコードは登録しない分岐があります。

MemberProfileForm::save()
<pre><code class="php">
if (is_null($value['value']))
{
if ($memberProfile)
{
if ($profile->isMultipleSelect())
{
$memberProfile->clearChildren();
}
$memberProfile->delete();
}
continue;
}
</code></pre>

is_null() の判定であるため、値が @NULL@ ではなく空文字列や空配列等である場合にはこのブロックは実行されず member_profile テーブルにはレコードが生成されることになります。

ユーザー入力値が空だった場合に、フォーム内での value がどの値になるかはバリデーターの empty_value オプションの値に依ります。
プロフィール項目の種類(フォームタイプと入力値タイプ)によって挙動が変わるのは、バリデーターをフォームタイプと入力値タイプによって生成している (opFormItemGenerator::generateValidator()) のが原因です。

例:
* 「フォームタイプ:テキスト、入力値タイプ:文字列」の場合、
バリデーターは opValidatorString で、empty_value は空文字列 → 公開設定が「保持される」
* 「フォームタイプ:テキスト、入力値タイプ:数値」の場合、
バリデーターは sfValidatorInteger で、empty_value は @NULL@ → 公開設定が「保持されない」

h3. Way to fix (修正内容)

修正内容を記入

Back