我想呈现一个symfony的形式是这样的:如何分别显示sfWidgetFormChoice的单选按钮?
我的问题是关于单选按钮窗口小部件:我不知道如何单独渲染每一个选择,为了显示与其他领域那些单选按钮。
有没有一种方法来实现这与symfony形式?
谢谢!
我想呈现一个symfony的形式是这样的:如何分别显示sfWidgetFormChoice的单选按钮?
我的问题是关于单选按钮窗口小部件:我不知道如何单独渲染每一个选择,为了显示与其他领域那些单选按钮。
有没有一种方法来实现这与symfony形式?
谢谢!
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);
}
}
}
尴尬的代码,但很容易在实践中使用,它赢得了”在未来不会中断。
如何定义具有相同名称和不同值的单独sfWidgetFormSelectRadio
小部件?
嗯,你说得对,它可能有用,但对我来说这不是一个明智的解决方案。 – Gregoire 2011-03-03 08:43:36
标准小部件不会允许您在一个字段的元素之间注入另一个字段;为此,请参阅sfWidgetFormSelectRadio::formatChoices()
。我的第一反应是扩展sfWidgetFormSelectRadio,包括一个renderChoice($value)
方法。
感谢分享!我还将它作为GitHub上的Gist存储为我自己的记录https://gist.github.com/4165050 – 2012-11-28 22:23:09
首先,感谢您分享此内容。我知道很久以前,但这是我发现的错误。也许将来需要它。 如果您的收音机选项是 '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