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 <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);
}
}
}
Неловкий код, но достаточно простой для использования на практике, и он не сломается в будущем.