Zend - 如何在viewscript中获取单独的单选按钮

时间:2011-11-24 12:58:12

标签: php forms radio-button zend-framework

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

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

我想检索它在viewscript中单独创建的输入。我试过了:

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

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

由于

3 个答案:

答案 0 :(得分:2)

尝试使用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;
}

答案 1 :(得分:1)

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

实际上这应该是Zend包含的内容,因为viewscript的主要原因之一是以自定义方式排列渲染元素,而不是手工渲染元素。我认为在这种情况下扩展类是值得的,因为这会使你的视图更加一致。可能你也想制作一个方法来渲染单选按钮的单例方面 - 标签和元素本身的开/关标签。

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

答案 2 :(得分:1)

简单但类似于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());