【问题标题】:Zend - How to get individual radio button in viewscriptZend - 如何在 viewscript 中获取单个单选按钮
【发布时间】:2012-01-05 15:31:24
【问题描述】:

我正在这样设置单选按钮:

$gender = new Zend_Form_Element_Radio('gender');
$gender->setLabel('Gender')
    ->addMultiOptions(array('m'=>'Male','f'=>'Female'))
    ->setDecorators(array('ViewHelper'))
    ->setRequired(true)
    ->addValidator('NotEmpty', true, $required);

我想检索它在视图脚本中单独创建的输入。我试过了:

$fields = $this->element->getElements();
$fields['gender']->getMultiOption('m')

但这只是获得“男性”的价值。如何获取 addMultiOptions 生成的单个无线电输入?

谢谢

【问题讨论】:

    标签: php forms radio-button zend-framework


    【解决方案1】:

    尝试使用 getMultiOptions() 方法:

    $fields = $this->element->getElements();
    $options = $fields['gender']->getMultiOptions();
    

    这是一个如何渲染单选按钮的示例:

    $fields = $this->element->getElements();
    echo "<label>{$fields['gender']->getLabel()}</label>";
    foreach($fields['gender']->getMultiOptions() as $value => $label) {
        echo '<input type="radio" value="' . $value . '" name="gender" /> ' . $label;
    }
    

    【讨论】:

    • getMultiOption('m') 的作用相同,只是它同时获取两个字符串,例如array('m'=&gt;'Male','f'=&gt;'Female')
    • 这就是重点——如果您不使用元素 render() 方法,您需要自己生成带有这些信息的单选按钮。无法获取特定按钮的 html - 仅适用于元素。
    • 你是说我想做的事是不可能的吗?如果不能,您能否举例说明它是如何工作的?谢谢
    • 你想要做的不是。但是你可以使用上面的方法得到类似的结果——自己渲染。请注意,html 内联 PHP 不好,您应该在视图中执行此操作并为每个 php 输出等开始新的 -tags ;)
    • 哈!我已经在这样做了。我认为有一种方法可以获取生成的输入,以便自动填充等。谢谢,即使不是我想要的,这是正确的答案
    【解决方案2】:

    可能更好的解决方案是扩展 radio 类以包含 renderMultiOption($opt) 函数。在该函数中,复制单选按钮在其股票渲染选项中的渲染方式(我相信您还需要查看 Zend_Form_Element_Multi,但不确定)

    真的这应该是 Zend 包含的东西,因为 viewscript 的主要原因之一是以自定义方式排列渲染的元素,而不是手动渲染元素。我认为在这种情况下扩展类是值得的,因为这将使您的视图脚本更加一致。可能您还想创建一种方法来呈现单选按钮的单例方面 - 元素本身的标签和打开/关闭标签。

    我将不得不自己做这件事,所以当我这样做时,我可能会发布我是如何做到的。我们需要为打印表单自定义排列单选按钮,但这不应该需要单独为单选按钮编写标记。

    【讨论】:

    • 我想出了一个解决方案,但我要等待发布它。它需要清理很多,我没有时间这样做。但是,请注意以下几点: 1. Zend_View_Helper_[x] 是概念上正确的实现方式。 2. 目前似乎没有办法为 Zend_Form_Element_Multi 的后代设置 partial 视图助手以允许渲染单个元素(这对于某些 Multi 元素没有意义。)
    • 总而言之,我已经在我们自己的库中扩展了这个类,并编写了一个方法来通过复制 Zend_View_Helper_FormRadio 的代码来为每个值输出一个单选按钮。这很混乱,因为那里有很多我(也不是你)不需要的东西。主要是需要传递视图以使功能正常工作...可能我不需要这些功能,但我没有时间修复接线。
    【解决方案3】:

    渲染自己的收音机的简单但类似于 Zend 的方法是创建自己的 View Helper:

    <?php
    
    class Zend_View_Helper_Radio extends Zend_View_Helper_Abstract {
    
        protected $name;
        protected $value;
        protected $id;
    
        public function radio($name, $value, $id = null) {
            $this->id = $id;
            $this->name = $name;
            $this->value = $value;
            return $this;
        }
    
        public function render() {
            $html = '';
    
            $html .= '<input type=radio';
            if ($this->id) {
                $html .= ' id="' . htmlspecialchars($this->id) . '"';
            }
            $html .= ' name="' . htmlspecialchars($this->name) . '"';
            $html .= ' value="' . htmlspecialchars($this->value) . '"';
            $html .= ' />';
    
            return $html;
        }
    
        public function __toString() {
            try {
            return $this->render();
            } catch (Exception $e) {
                return $e->getMessage();
            }
        }
    }
    

    然后,您可以使用助手渲染与 Hikaru-Shindo 已经提到的相同的元素:

    foreach ($form->gender->getMultiOptions() as $value => $name) {
        echo '<label for="gender-', $value, '">';
        echo $this->radio('gender', $value, 'gender-' . $value);
        echo '<img src="/css/gender-', $value, '.png">';
        echo $name, '</label>';
    };
    

    当然,您可以专门为您的案例创建另一个 View Helper,然后呈现为 ​​

    $this->genderSelection($form->gender->getMultiOptions());
    

    【讨论】:

      猜你喜欢
      • 2012-04-04
      • 1970-01-01
      • 1970-01-01
      • 2011-07-28
      • 2013-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多