2011-03-02 63 views
2

我想呈现一个symfony的形式是这样的:如何分别显示sfWidgetFormChoice的单选按钮?

form with radio buttons

我的问题是关于单选按钮窗口小部件:我不知道如何单独渲染每一个选择,为了显示与其他领域那些单选按钮。

有没有一种方法来实现这与symfony形式?

谢谢!

回答

5

Symfony使这有点难以做到。你想从视图中调用一个renderChoice($value)方法,但这需要更改或扩展sfFormField。

更改它不是未来的证明,并且扩展它也会要求您更改一些symfony变量,以便视图中可访问的字段是此新类的实例。我不知道该选项是否存在。

取而代之,我选择将sfWidgetFormSelectRadio扩展到以下非常简单的类中,该类扩展了formatChoices。它会检查你是否只要求一个选项。如果是,则呈现该标记并将其返回,否则通常通过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 <[email protected]> 
* @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); 
    } 
    } 
} 

尴尬的代码,但很容易在实践中使用,它赢得了”在未来不会中断。

+0

感谢分享!我还将它作为GitHub上的Gist存储为我自己的记录https://gist.github.com/4165050 – 2012-11-28 22:23:09

+1

首先,感谢您分享此内容。我知道很久以前,但这是我发现的错误。也许将来需要它。 如果您的收音机选项是 'array(1 =>“是”,0 =>“否”)' 小部件将无法正确显示。因为第一行中的$ onlyChoice = ...对于选项'0 =>“否”'将评估为“false”。这将强制执行else路径,并将显示选项0而不是一个的2个单选按钮。最后,你将有3个单选按钮,而不是2. 对我来说,这个改变是有效的:'if(!is_null($ onlyChoice)&& is_int(intval($ onlyChoice)))'' – cb0 2013-03-06 14:38:49

0

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

+1

嗯,你说得对,它可能有用,但对我来说这不是一个明智的解决方案。 – Gregoire 2011-03-03 08:43:36

1

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