【问题标题】:How to display radio buttons of a sfWidgetFormChoice individually?如何单独显示 sfWidgetFormChoice 的单选按钮?
【发布时间】:2011-03-02 14:41:32
【问题描述】:

我想用这种方式渲染一个 symfony 表单:

我的问题与单选按钮小部件有关:我不知道如何单独呈现每个选项,以便在这些单选按钮之间显示其他字段。

有没有办法通过 symfony 表单实现这一点?

谢谢!

【问题讨论】:

    标签: symfony1 symfony-1.4 symfony-forms


    【解决方案1】:

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

    笨拙的代码,但在实践中很容易使用,并且将来不会中断。

    【讨论】:

    • 感谢分享!我还将它作为 Gist 存储在 GitHub 上以供我自己记录gist.github.com/4165050
    • 首先,感谢分享。我知道这是很久以前的事了,但这就是我发现的错误。也许将来有人会需要它。如果您的收音机选项是例如array(1=&gt;"Yes", 0=&gt;"No") 小部件无法正确显示。因为第一行中的 $onlyChoice=... 对于选项 0=&gt;"No" 将评估为“false”。然后,这将强制执行 else 路径,并为选项 0 显示 2 个单选按钮,而不是一个。最后,您将拥有 3 个单选按钮而不是 2 个。对我而言,此更改有效:if(!is_null($onlyChoice) &amp;&amp; is_int(intval($onlyChoice)))
    【解决方案2】:

    标准小部件不允许您在一个字段的元素之间注入另一个字段;请参阅sfWidgetFormSelectRadio::formatChoices() 了解为什么会这样。我的第一反应是扩展 sfWidgetFormSelectRadio,包括一个renderChoice( $value ) 方法。

    【讨论】:

      【解决方案3】:

      如何定义具有相同名称和不同值的单独sfWidgetFormSelectRadio 小部件?

      【讨论】:

      • 哼,你说得对,它可能有效,但对我来说不是一个聪明的解决方案。
      猜你喜欢
      • 2019-01-09
      • 1970-01-01
      • 2014-10-14
      • 2015-11-26
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多