1

同じモデルの複数のフォームを同じページに表示する際に問題が発生します。問題は、NameFormat を使用すると、フィールドの ID が同じになることです。

$this->widgetSchema->setNameFormat('display[%s]');

表示します

<form class="update_display_form" id="update_display_0" action="/iperf/web/frontend_dev.php/update_display" method="post"> 
  <input type="checkbox" name="display[displayed]" checked="checked" id="display_displayed" />
  <label for="display_displayed">test</label> 
</form> 
<form class="update_display_form" id="update_display_1" action="/iperf/web/frontend_dev.php/update_display" method="post">
  <input type="checkbox" name="display[displayed]" checked="checked" id="display_displayed" />
  <label for="display_displayed">truc</label> 
</form>

そして、2 番目のラベルをクリックすると、最初のチェックボックスが有効になり ます。オブジェクト ID を使用してそれらを一意にすることができると考えました。

$this->widgetSchema->setNameFormat('display'.$this->getObject()->getId().'[%s]');

しかし、パラメータの名前がわからないため、リクエストを処理できません。

私が見つけた最良のオプションは、 ID を設定することでした:

$this->widgetSchema['displayed']->setAttributes(array("id" => "display".$this->getObject()->getId() ));

しかし、ラベルとチェックボックスの間の接続が完全に失われます。

ラベルの「for」属性を変更できれば、問題は解決します。誰かがそれを行う方法を知っていますか? または他のオプションですか?

4

2 に答える 2

3

ここにアイデアがあります...別の名前形式を動的に設定するために、アクションからフォームクラスに変数をプッシュします。

あなたの行動で:

$this->form_A = new displayForm(array(),array('form_id' = 'A')); // pass a form id
$this->form_B = new displayForm(array(),array('form_id' = 'B'));
$this->form_C = new displayForm(array(),array('form_id' = 'C'));

あなたのフォームクラスで:

$form_id = $this->getOption('form_id'); // get the passed value
$this->widgetSchema->setNameFormat('display'.$form_id.'[%s]'); // stick it into the name

醜いですが、もっときれいなものを思い付くことができると確信しています...

于 2010-05-29T12:22:17.877 に答える
2

フォーム間のチェックボックス/ラベルの相互作用の競合は、name 属性ではなく、タグの id/for 属性が原因です。

そのため、フォームのウィジェット名の形式を変更する必要がなく、リクエスト オブジェクトから送信されたデータを読み取る際に問題が発生することはありません (リクエスト キーをフォームの URL パラメータ/非表示の入力として渡すか、フォームごとにレイアウトで作成されたすべてのフォーム名の組み合わせをループして見つけます)。一致するもの)。

sfForm クラスにはそのための sfWidgetFormSchema::setIdFormat() メソッドがあります。

// Creating form instances

$formA = new sfForm();
$formA->getWidgetSchema()->setIdFormat( '%s1' );
$formA->getWidgetSchema()->setNameFormat( 'display' );
... // configure the form

$formB = new sfForm();
$formB->getWidgetSchema()->setIdFormat( '%s2' );
$formB->getWidgetSchema()->setNameFormat( 'display' );
... // configure the form

$formC = new sfForm();
$formC->getWidgetSchema()->setIdFormat( '%s3' );
$formC->getWidgetSchema()->setNameFormat( 'display' );
... // configure the form


// Processing a request data

$form = new sfForm();
... // configure the form
$_formNameRequestKey = $form->getName();
if( $request->hasParameter( $_formNameRequestKey ) ) {
  $form->bind( $request->getParameter( $_formNameRequestKey ) );
}

... or just ...
if( $request->hasParameter( 'display' ) ) {
  $form->bind( $request->getParameter( 'display' ) );
}
于 2011-03-28T21:04:20.780 に答える