Zend形成彼此相邻的输入字段

时间:2011-04-20 13:36:56

标签: php zend-framework zend-form

如果您正在阅读本文,您可能知道自定义Zend表单布局有多痛苦。我想要实现的是这样的布局:

Name: [Type your first name here][Type your last name here]
Address: [Type your street here][Type your number here][Type your addition here]

有谁知道如何实现这一目标,还是有人能指出我的好榜样?

2 个答案:

答案 0 :(得分:2)

我要做的是为表单和不同类型的字段创建自定义装饰器。

周围表单元素的表单装饰器

<form>%rows</form>

用于分隔行的行装饰器

<div style="clear: both">%elements</div>

一个元素装饰器,它既显示了标签又显示了元素,并且全部浮动到左侧

<span style="float: left">%label</span>%left_floated_element

元素装饰器,仅显示元素并将其浮动到左侧

%left_floated_element

输出结果如下:

<!-- Form decorator output -->
<form>
    <!-- Extra decorator to make sure you get rows -->
    <div style="clear: both">
        <!-- First element decorator output: label and element -->
        <span style="float: left">Name</span><input type="text" name="firstname" style="float: left" .../> 
        <!-- Second element decorator output: just the element -->
        <input type="text" name="lastname" style="float: left" .../> 
    </div>
    <!-- Extra decorator to make sure you get rows -->
    <div style="clear: both">
        <!-- First element decorator output: label and element -->
        <span style="float: left">Address</span><input type="text" name="street" style="float: left" .../> 
        <!-- Second element decorator output: just the element -->
        <input type="text" name="number" style="float: left" .../> 
        <!-- Second element decorator output: just the element -->
        <input type="text" name="addition" style="float: left" .../> 
    </div>
</form>

您还可以更改使用的HTML来构建表,而不是使用div来完成工作。

查看Zend Framework手册,了解有关如何创建自定义装饰器的更多信息。

http://framework.zend.com/manual/en/zend.form.decorators.html

答案 1 :(得分:1)

最终会发生什么,我认为这通常是Zend_Form的弱点,因为您经常希望能够在您认为合适的情况下自由放置标签。如果您要重用显示样式(例如,如果您正在创建类似应用程序的Sharepoint),那么创建自定义装饰器是有意义的,但是在不会重复使用表单的情况下,或者必须针对空间限制进行​​自定义时,可视化风格等,为每种情况创建装饰器太贵了。装饰者应该是你的第二个手段,即当你喜欢显示风格并希望在你的网站的任何地方使用它。

在O'Phinney的设计中,你可以做些什么来绕过这一点nik nak是从装饰者那里删除标签,但仍然设置了标签。使用这样的视图:

$form->setDecorators(array('ViewScript',array('viewScript' => 'path/from/views/scripts/of/module'));

在viewscript中,布局html就像正常一样。这样,您就不必为所需的视觉/结构显示的每个变体创建任意结构。

$this->element->name;

将生成无标签字段。

$this>element->name->getLabel(); 

将生成标签文本。

如果你需要一些关于如何枚举装饰器来获得这种效果的帮助,通常如果你使用的是Dojo Elements,你就有

array('DijitElement','Errors','HtmlTag','Label')

作为你的装饰者。

只需删除标签即可。如果label在这样的数组中

array('Label',array(...))

删除该数组,因为它代表该装饰器的配置。

但是,当然,在选项中确保设置'label'=> 'desired label'

现在,在您的表单中,您可以随意放入这些元素,而不必限制标签的位置!

请注意,如果您在表单字段中使用装饰器的默认设置,您可能想要弄清楚默认装饰器是什么,因为当您开始设置它们时,您可能会意外错过装饰器并丢失一些东西。