如果您正在阅读本文,您可能知道自定义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]
有谁知道如何实现这一目标,还是有人能指出我的好榜样?
答案 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'
。
现在,在您的表单中,您可以随意放入这些元素,而不必限制标签的位置!
请注意,如果您在表单字段中使用装饰器的默认设置,您可能想要弄清楚默认装饰器是什么,因为当您开始设置它们时,您可能会意外错过装饰器并丢失一些东西。