如何更改 symfony 中 sfWidgetFormSelectRadio 的行为?

发布于 2024-08-23 11:55:01 字数 353 浏览 10 评论 0原文

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" />
new sfWidgetFormSelectRadio(
                array('choices' => $images)));

The above will render each option something like:

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

How to make it render this way with minimal code:

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

默嘫て 2024-08-30 11:55:01

这是未经测试的,是我直接阅读 Symfony API 文档

像这样重写 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 才能使用新的小部件。

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

This is untested and straight from me reading the Symfony API docs for that widget. You'll need to extend the sfWidgetFormSelectRadio class, call it something like myWidgetFormSelectRadio and stick it in lib/widget/myWidgetFormSelectRadio.class.php in your project.

Override the formatChoices() method like so:

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

so you're basically appending the img tag to the input.

In your form's configure() method you'll then need to switch from using sfWidgetFormSelectRadio to using myWidgetFormSelectRadio to use the new widget.

Let me know if this works ;-)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文