如何在symfony中更改sfWidgetFormSelectRadio的行为?

时间:2010-03-01 11:52:29

标签: symfony1 formatter

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 个答案:

答案 0 :(得分:2)

这是我未经测试的直接阅读Symfony API文档for that widget。您需要扩展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来使用新的小部件。

让我知道这是否有效; - )