Как изменить поведение sfWidgetFormSelectRadio в Symfony? - PullRequest
0 голосов
/ 01 марта 2010
new sfWidgetFormSelectRadio(
                array('choices' => $images)));

Выше будет отображать каждый параметр что-то вроде:

<input type="radio" name="name" value="image_path">

Как сделать так, чтобы он отображался таким образом с минимальным кодом:

<input type="radio" name="name" value="image_path"><img src="image_path" />

1 Ответ

2 голосов
/ 01 марта 2010

Это непроверенное и прямо мне читающее документы Symfony API для этого виджета . Вам нужно будет расширить класс sfWidgetFormSelectRadio, назвать его как myWidgetFormSelectRadio и вставить его в lib/widget/myWidgetFormSelectRadio.class.php в вашем проекте.

Переопределите метод formatChoices() следующим образом:

class myWidgetFormSelectRadio extends sfWidgetFormSelectRadio
{
  protected function formatChoices($name, $value, $choices, $attributes)
  {
    $inputs = array();
    foreach ($choices as $key => $option)
    {
      $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';
      }

      $inputs[$id] = array(
        'input' =>
          $this->renderTag('input', array_merge($baseAttributes, $attributes))
          . $this->renderTag('img', array('src' => self::escapeOnce($key))),
        'label' => $this->renderContentTag('label', self::escapeOnce($option), array('for' => $id)),
      );
    }

    return call_user_func($this->getOption('formatter'), $this, $inputs);
  }
}

так что вы в основном добавляете тег img ко входу.

В методе configure() вашей формы вам потребуется переключиться с использования sfWidgetFormSelectRadio на использование myWidgetFormSelectRadio для использования нового виджета.

Дайте мне знать, если это работает; -)

...