Как индивидуально отобразить переключатели sfWidgetFormChoice? - PullRequest
2 голосов
/ 02 марта 2011

Я хотел бы отобразить форму Symfony следующим образом:

form with radio buttons

Моя проблема касается виджета переключателей: я не знаю, как отобразить каждый выбор по отдельности,для отображения других полей между этими переключателями.

Есть ли способ добиться этого с помощью форм Symfony?

Спасибо!

Ответы [ 3 ]

5 голосов
/ 25 июня 2011

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);
    }
  }
}

Неловкий код, но достаточно простой для использования на практике, и он не сломается в будущем.

1 голос
/ 03 марта 2011

Стандартные виджеты не позволяют вставлять другое поле между элементами одного поля;см. sfWidgetFormSelectRadio::formatChoices(), почему это так.Моя первая реакция - расширить sfWidgetFormSelectRadio, включая метод renderChoice( $value ).

0 голосов
/ 03 марта 2011

Как насчет определения отдельных sfWidgetFormSelectRadio виджетов с одинаковыми именами и разными значениями?

...