2

このようにsymfonyフォームをレンダリングしたいと思います:

ラジオボタン付きのフォーム

私の問題はラジオボタンウィジェットに関するものです。これらのラジオボタンの間に他のフィールドを表示するために、各選択肢を個別にレンダリングする方法がわかりません。

symfonyフォームでこれを達成する方法はありますか?

ありがとう!

4

3 に答える 3

5

symfonyはこれを行うのを少し難しくします。ビューから呼び出し可能なrenderChoice( $value)メソッドが必要ですが、sfFormFieldを変更または拡張する必要があります。

これを変更することは将来を保証するものではなく、拡張すると、ビューでアクセス可能なフィールドがこの新しいクラスのインスタンスになるように、symfony変数を変更する必要があります。そのオプションが存在するかどうかはわかりません。

代わりに、sfWidgetFormSelectRadioを、を拡張する次の非常に単純なクラスに拡張することを選択しましたformatChoices。1つのオプションのみを要求しているかどうかを確認します。そうである場合は、そのタグをレンダリングして返します。そうでない場合は、を介して通常どおりにレンダリングしますparent::

これにより、ビューから呼び出すことができます。レンダリングするラジオオプションのインデックスは$form['field']->render(array('only_choice'=> $value))
どこにありますか。$value

<?php

/**
 * sfWidgetFormSelectRadioSingleable lets you render just one option at a time.
 *
 * @package    symfony
 * @subpackage widget
 * @author     Fabien Potencier <fabien.potencier@symfony-project.com>
 * @version    SVN: $Id: sfWidgetFormSelectRadio.class.php 27738 2010-02-08 15:07:33Z Kris.Wallsmith $
 */
class sfWidgetFormSelectRadioSingleable extends sfWidgetFormSelectRadio
{
  public function formatChoices($name, $value, $choices, $attributes)
  {
    $onlyChoice = (!empty($attributes['only_choice'])) ? $attributes['only_choice'] : false; unset($attributes['only_choice']);

    if($onlyChoice)
    {
      if(!isset($choices[$onlyChoice]))
          throw new Exception("Option '$onlyChoice' doesn't exist.");

      $key    = $onlyChoice;
      $option = $choices[$key];
      $baseAttributes = array(
        'name'  => substr($name, 0, -2),
        'type'  => 'radio',
        'value' => self::escapeOnce($key),
        'id'    => $id = $this->generateId($name, self::escapeOnce($key)),
      );

      if (strval($key) == strval($value === false ? 0 : $value))
      {
        $baseAttributes['checked'] = 'checked';
      }

      return $this->renderTag('input', array_merge($baseAttributes, $attributes));
    }
    else
    {
      return parent::formatChoices($name, $value, $choices, $attributes);
    }
  }
}

厄介なコードですが、実際に使用するのは簡単で、将来壊れることはありません。

于 2011-06-24T22:58:41.350 に答える
1

標準のウィジェットでは、1つのフィールドの要素の間に別のフィールドを挿入することはできません。sfWidgetFormSelectRadio::formatChoices()これがなぜであるかを見てください。renderChoice( $value )私の最初の反応は、メソッドを含めてsfWidgetFormSelectRadioを拡張することです。

于 2011-03-03T16:41:09.333 に答える
0

sfWidgetFormSelectRadio同じ名前で異なる値を持つ別々のウィジェットを定義するのはどうですか?

于 2011-03-03T04:06:23.920 に答える