替代PHP QuickForm?
我目前正在使用HTML_QuickForm在PHP中生成表单。似乎有点局限性,因为很难插入我自己的JavaScript或者自定义某些元素的显示和分组。
QuickForm是否有其他替代方案可以提供更大的灵活性?
解决方案
回答
如果我们发现很难将Javascript插入表单元素中,请考虑使用JavaScript框架,例如Prototype或者jQuery。在那里,我们可以集中将事件处理注入到表单控件中的任务。
那样的话,我的意思是我们不需要在HTML表单代码中插入事件处理程序。而是从其他地方注册这些事件。例如,在Prototype中,我们可以编写如下代码:
$('myFormControl').observe('click', myClickFunction)
也可以看看另一个问题的答案。
/ EDIT:当然,我们还可以使用HTML_QuickForm将自定义属性(因此将事件处理程序)插入表单元素。但是,上述方法是优越的。
回答
我发现Zend框架的Zend_Form包特别灵活。该组件也可以与Zend_Dojo一起使用,以快速实现常见的javascript表单助手。但是,当涉及到我们所使用的库时,该组件是不可知的,但它会天真的支持Dojo。该组件还允许分组,多页表单,自定义装饰器,验证器和其他功能,使其非常灵活。
回答
我将第二个Zend_Form;它具有出色的ini样式实现,可让我们非常快速地定义表单:
[main] vessel.form.method = "post" vessel.form.elements.name.type = "text" vessel.form.elements.name.name = "name" vessel.form.elements.name.options.label = "Name: " vessel.form.elements.name.options.required = true vessel.form.elements.identifier_type.type = "select" vessel.form.elements.identifier_type.name = "identifier_type" vessel.form.elements.identifier_type.options.label = "Identifier type: " vessel.form.elements.identifier_type.options.required = true vessel.form.elements.identifier_type.options.multioptions.IMO Number = "IMO Number"; vessel.form.elements.identifier_type.options.multioptions.Registry organisation and Number = "Registry organisation and Number"; vessel.form.elements.identifier_type.options.multioptions.SSR Number = "SSR Number"; vessel.form.elements.identifier.type = "text" vessel.form.elements.identifier.name = "identifier" vessel.form.elements.identifier.options.label = "Identifier: " vessel.form.elements.identifier.options.required = true vessel.form.elements.identifier.options.filters.lower.filter = "StringToUpper" vessel.form.elements.email.type = "text" vessel.form.elements.email.name = "email" vessel.form.elements.email.options.label = "Email: " vessel.form.elements.email.options.required = true vessel.form.elements.owner_id.type = "hidden" vessel.form.elements.owner_id.name = "owner_id" vessel.form.elements.owner_id.options.required = true ; submit button vessel.form.elements.submit.type = "submit" vessel.form.elements.submit.name = "Update" vessel.form.elements.submit.option.value = "Update"
回答
我为OnLamp写了一篇关于此的文章:自动填充的PHP表单
我对HTML_QuickForm和Zend_Form以及我可以找到的所有其他表单处理框架的追求是,它们似乎假设我们将编写代码来生成表单。但这与我的开发过程不符,我从页面的LOOK(通过HTML模板指定)开始并向其中添加功能。
在我看来,表单处理可归结为:
- 提取应该以表格形式开始的数据(通常是从数据库中)。
- 获取表单的HTML代码(通常是模板)。
- 将1和2融合在一起,然后输出结果。
- 获取提交的表单数据并进行验证。
- 重新显示带有错误消息和无效数据的表格,或者
- 显示祝贺数据正常。
fillInFormValues()使2、3和5变得非常简单。
回答
使用Zend_Form,完全有可能从视觉上开始表单,然后处理反向词。
这是通过删除所有装饰器并将其替换为ViewScript装饰器来完成的。
$this->form->setDecorators( array(array('ViewScript', array('viewScript' => 'forms/aform.phtml'))));
在该视图脚本中,我们将执行以下操作:
<?=$this->element->title->renderViewHelper()?>
使用这种方法,我们基本上可以对表单进行任何操作。
Zend_Form的另一个优点是,我们可以创建自定义元素,以将其他内容封装在其中。例如,我们可以具有一个输出文本区域的元素,然后输出一些Javascript将其转换为WYSIWYG区域。
回答
我真的不能说什么,但是有一天,我碰到了克隆鱼表单库。它看起来很有希望,最终可以作为"稍后查看"而出现在我的书签列表中。