Project

General

Profile

Bug(バグ) #3209

携帯版の「携帯メールアドレス設定」で入力フォームが表示されない

Added by Yuya Watanabe about 7 years ago. Updated over 2 years ago.

Status:
Won't fix(対応せず)
Priority:
High(高め)
Assignee:
Target version:
Start date:
2012-09-26
Due date:
% Done:

0%

3.6 で発生するか:
Yes (はい)
3.8 で発生するか:
Yes (はい)

Description

概要

携帯版の「携帯メールアドレス設定」で入力フォームが表示されない

下記図のメニュー「携帯メールアドレス設定」を選択した後その次のページには携帯メールアドレス設定が表示されるはずが表示されない

本来は下記のように表示されるべきである.

確認環境

OpenPNE 3.6.5

原因

下記コード部で,「携帯メールアドレス設定」の場合に $form->count() の値が 1 となっており 7 行目のフォームが表示される動作が行われずに 13 行目のフォームフィールドが csrf_token 用のフォームのみが存在する場合に該当してしまうため表示が行われない.

これが 「携帯メールアドレス設定」の場合にのみ発生する原因はわかっていない.

apps/mobile_frontend/modules/member/templates/configSuccess.php

  7 <?php if ($categoryName && 1 < $form->count()): // except CSRF token field ?>
  8 <?php op_include_form('configForm', $form, array(
  9   'url'    => url_for('member/config?category='.$categoryName),
 10   'align'  => 'center',
 11   'button' => __('Save')
 12 )) ?>
 13 <?php elseif ($categoryName && 1 === $form->count()) : ?>
 14 <?php echo __('There is no available settings.'); ?>
 15 <?php else: ?>
 16 <?php echo __('Please select the item from the menu.'); ?>
 17 <?php endif; ?> 

screenshot.png View (31 KB) Yuya Watanabe, 2012-09-26 14:19

screenshot2.png View (18.6 KB) Yuya Watanabe, 2012-09-26 14:19

screenshot3.png View (24.6 KB) Yuya Watanabe, 2012-09-26 14:27


Related issues

Related to OpenPNE 3 - Backport(バックポート) #3231: 携帯版の「携帯メールアドレス設定」で入力フォームが表示されない Fixed(完了) 2012-09-26
Related to OpenPNE 3 - Backport(バックポート) #3253: 携帯版の「携帯メールアドレス設定」で入力フォームが表示されない Fixed(完了) 2012-09-26

Associated revisions

Revision 023549e5 (diff)
Added by Yuya Watanabe about 7 years ago

(fixes #3209) fixed to reset form fields when the widget added

History

#1 Updated by Yuya Watanabe about 7 years ago

#2 Updated by Yuya Watanabe about 7 years ago

  • 3.6 で発生するか changed from Unknown (未調査) to Yes (はい)

#3 Updated by Yuya Watanabe about 7 years ago

  • Priority changed from Normal(通常) to High(高め)
  • Target version set to OpenPNE 3.9.0-old
  • 3.8 で発生するか changed from Unknown (未調査) to Yes (はい)

#4 Updated by Yuya Watanabe about 7 years ago

  • Assignee set to Yuya Watanabe

#5 Updated by Rimpei Ogawa about 7 years ago

原因について調べた結果を書きます。

発生条件

この問題は以下の条件をすべて満たす場合に発生します。

  • mobile_frontend アプリケーション
  • MemberConfig に対応するデータが存在しない

原因詳細

以下のような流れで問題が発生します。

  1. FormFieldSchema が _csrf_token のみの時点で初期化される【BaseForm::appendMobileInputMode()】
  2. WidgetSchema に MemberConfigWidget を登録する際に FormFieldSchema を破棄しない【MemberConfigForm::setMemberConfigWidget()】
  3. sfForm::setDefault() を呼ばない場合は FormFieldSchema が破棄されることなく Form の初期化が終了する
  4. sfForm::count() は FormFieldSchema を参照するため結果が 1 となる【テンプレート】

1. の appendMobileInputMode() が実行されるのは mobile_frontend アプリケーションのみなので、発生条件の一つになります。FormFieldSchema の初期化は foreach 部分で暗黙的に sfForm::offsetGet() が呼ばれることにより行われます。また、BaseForm::__construct() 実行後に widget 追加されることは想定されていないため、このチケットの問題の他に appendMobileInputMode() の効果が MemberConfigForm の widget には適用されないという別の問題があります。

2. は widget 登録時に sfForm::setWidget() を通さず WidgetSchema への直接登録のみで済ませているために、FormFieldSchema が破棄されません(sfForm::setWidget() は内部で sfForm::resetFormFields() を呼ぶことで破棄をする)。ここで setWidget() を呼ぶようにすれば問題は解消します。

--- a/lib/form/doctrine/MemberConfigForm.class.php
+++ b/lib/form/doctrine/MemberConfigForm.class.php
@@ -109,7 +109,7 @@ class MemberConfigForm extends BaseForm
   public function setMemberConfigWidget($name)
   {
     $config = $this->memberConfigSettings[$name];
-    $this->widgetSchema[$name] = opFormItemGenerator::generateWidget($config);
+    $this->setWidget($name, opFormItemGenerator::generateWidget($config));
     $this->widgetSchema->setLabel($name, $config['Caption']);
     $memberConfig = Doctrine::getTable('MemberConfig')->retrieveByNameAndMemberId($name, $this->member->getId());
     if ($memberConfig) {

3. の sfForm::setDefault() は内部で sfForm::resetFormFields() を呼ぶため、FormFieldSchema を破棄してくれます。MemberConfig のデータが存在する場合はこの処理が呼ばれるので問題が発生しません。発生条件の一つです。ここに限らずどこかのタイミングで sfForm::resetFormFields() を呼ぶのも解決策になります。

#6 Updated by Yuya Watanabe about 7 years ago

setWidget() の中で resetFormFields() が呼ばれていることから, 更新時には FormFields のリセットが必要という意図が受け取られるので sfForm の外側で widget を更新しながら resetFormFields() を呼ぶようなコードは,意図に反した処理を行いながら無理矢理辻褄をあわせている感じがするので嫌です.また setDefault() についても意図してそういう実装になっているわけではなく偶然動いてるような気がするためこちらも嫌です.よって widget を更新するという意図を変更せずに FormFields を明示的にリセットするように記述されている setWidget() を用いるような方法を用いて修正を行います.

lib/vendor/symfony/lib/form/sfForm.class.php
   664   public function setWidget($name, sfWidgetForm $widget)
   665   {
   666     $this->widgetSchema[$name] = $widget;
   667 
   668     $this->resetFormFields();
   669 
   670     return $this;
   671   }

#7 Updated by Yuya Watanabe about 7 years ago

  • Status changed from New(新規) to Accepted(着手)

#8 Updated by Yuya Watanabe about 7 years ago

  • Status changed from Accepted(着手) to Pending Review(レビュー待ち)
  • % Done changed from 0 to 50

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

#9 Updated by Rimpei Ogawa about 7 years ago

  • Status changed from Pending Review(レビュー待ち) to Pending Testing(テスト待ち)
  • % Done changed from 50 to 70

#12 Updated by isao sano over 2 years ago

  • Status changed from Pending Testing(テスト待ち) to Won't fix(対応せず)
  • % Done changed from 70 to 0

OpenPNE 3.8.3 にて対応済みであったため、対応せずとします。

Also available in: Atom PDF