替代PHP QuickForm?

时间:2020-03-05 18:52:40  来源:igfitidea点击:

我目前正在使用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区域。

回答

我真的不能说什么,但是有一天,我碰到了克隆鱼表单库。它看起来很有希望,最终可以作为"稍后查看"而出现在我的书签列表中。