Symfony1 如何单独显示sfWidgetFormChoice的单选按钮?

Symfony1 如何单独显示sfWidgetFormChoice的单选按钮?,symfony1,symfony-1.4,symfony-forms,Symfony1,Symfony 1.4,Symfony Forms,我希望通过以下方式呈现symfony表单: 我的问题与单选按钮小部件有关:我不知道如何单独呈现每个选项,以便在这些单选按钮之间显示其他字段 有没有办法用symfony表单实现这一点 谢谢 如何定义具有相同名称和不同值的单独窗口小部件?标准窗口小部件不允许您在一个字段的元素之间插入另一个字段;请参阅sfWidgetFormSelectRadio::formatChoices()了解原因。我的第一反应是扩展sfWidgetFormSelectRadio,包括一个renderChoice($valu

我希望通过以下方式呈现symfony表单:

我的问题与单选按钮小部件有关:我不知道如何单独呈现每个选项,以便在这些单选按钮之间显示其他字段

有没有办法用symfony表单实现这一点


谢谢

如何定义具有相同名称和不同值的单独窗口小部件?

标准窗口小部件不允许您在一个字段的元素之间插入另一个字段;请参阅
sfWidgetFormSelectRadio::formatChoices()
了解原因。我的第一反应是扩展sfWidgetFormSelectRadio,包括一个
renderChoice($value)
方法。

Symfony使得这有点困难。您需要一个可从视图调用的
renderChoice($value)
方法,但这需要更改或扩展sfFormField

更改它不是未来的证明,扩展它还需要更改一些symfony变量,以便视图中可访问的字段是这个新类的实例。我不知道这个选项是否存在

相反,我选择将sfWidgetFormSelectRadio扩展到以下非常简单的类中,该类扩展了
formatChoices
。它将检查您是否只要求一个选项。如果是,它将呈现该标记并返回它,否则它将通过
父项::
正常呈现

这允许您从视图中调用:
$form['field']->render(数组('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);
    }
  }
}

嗯,你说得对,它可能有用,但对我来说不是一个聪明的解决方案。谢谢分享!首先,我还将其存储在GitHub上作为我自己记录的要点,感谢分享。我知道这是很久以前的事了,但我发现这里有问题。也许将来会有人需要它。如果您的无线电选项为例如
阵列(1=>“是”,0=>“否”)
小部件将无法正确显示。因为$onlyChoice=。。。在第一行中,选项
0=>“No”
的计算结果将为“false”。这将强制执行else路径,并将显示选项0的两个单选按钮,而不是一个。最后,您将有3个单选按钮,而不是2个。对我来说,这种改变是有效的:
如果(!is_null($onlyChoice)&&is_int(intval($onlyChoice))