Zend Form如何控制单个表单元素的渲染?

How to control individual form element rendering in Zend Form?

简介

我正在使用 Zend Form 库。我希望能够设计或控制单选框的构造方式。目前元素的渲染是"in one row"。然而,我想要做的是在其自己的行上呈现每个选项。库似乎不提供简单的注入,即 <br> 标记,这是我通常在 HTML 中使用的标记。无论如何,我需要帮助弄清楚如何使图书馆满足我的需要。

控制器

    use Zend\Form\Element;
    use Zend\Form\Form;

    $radio = new Element\Radio('gender');

    $radio->setValueOptions(array(
        '1' => 'Male',
        '2' => 'Female',
        '3' => 'Other',            
    ));
    $radio->setValue(2);

在视图中

<?=$this->formRadio($this->form->get('gender'));?>

观察呈现为

的元素
* Male * Female * Other

希望元素呈现为

* Male
* Female
* Other

如何?

示例HTML渲染

<form class='my-form'>
    <table>
        <tr>
            <td>
                <label><input name="gender" type="radio" value="1">Male</label> 
                <label><input name="gender" type="radio" value="2">Female</label>
            </td>
        </tr>
    </table>
</form>

您可以完全避开 Zend Framework 并通过使用 CSS 来解决这个问题,从而节省一些页面重量(通过不使用 br 标记)。

只需查看用于呈现列表项的重复元素的标签或 class名称(听起来像是单选输入)并将其设置为垂直显示而不是水平显示。

一个例子:

.my-form input[type="radio"] {
    display: block;
}

这将比 Zend 中的自定义渲染装饰器更快更简单。

编辑:既然您已经提供了确切的 HTML,这里有一些改进。

1) 输入嵌套在标签中,因此您将修改标签的显示而不是输入。

.my-form label {
    display: block;
}

2) 呈现的表单(如果这是准确的)当前没有 class 名称。如果表单永远不会在页面上使用超过一次,那么当前 ID 就可以了,您将必须更改 CSS 中的选择器以使用 ID 表示法。

#myform label 而不是 .my-form label

否则,您可以使用 Zend 的 setAttribute 函数添加一个 class 名称。

$form -> setAttribute('class', 'my-form');