Zend Framework表单,装饰器和验证:我应该回到纯HTML吗?

Aro*_*eel 20 php zend-framework decorator zend-form

我目前正在开发一个包含大量表单的大型应用程序.

到目前为止,我一直在手工编写我的表单并编写自己的验证逻辑,但我已经决定是时候开始使用Zend_Form并且它是内置的验证例程.

但是,我一直在绊倒越来越多关于(缺乏)灵活性的问题Zend_Form_Decorator.简单的任务,如为单个输入元素添加额外的按钮,变得非常困难.

我现在已经达到了一个点,我正在认真考虑完全放弃Zend_Form_Element+ Zend_Form_Decorator方法,但我不想失去优秀的验证选项.

基本上,我想要两全其美:

  • 以最终用户看待它们的方式编写表单:用纯HTML格式
  • 在不破坏太多ZF标准行为的情况下,轻松地向表单字段添加服务器端验证

我正在考虑的一种可能的解决方案是在服务器端和视图中一起编写表单.这将允许我轻松验证我自己的表单,但(在我看来相当大)的缺点是每个表单应该定义两次,这只是感觉完全错误.

有没有指导方针呢?你们有没有经历过同样的事情,如果有的话,你们是如何解决这些问题的?

我非常想听听你的观点.

Cal*_*son 21

我也发现默认装饰器是一个巨大的痛苦.我明白为什么他们就是这样,但我认为"不便因素"被严重低估了.

无论如何,我建议您使用ViewScripts表单.请注意,这些与视图不同 - 相反,ViewScripts在Form类中显式引用,充当排序的"子视图",并允许您控制每个元素的布局.过去有些难以找到如何使用ViewScripts的例子,但我会尝试提供一些有用的东西.

首先,覆盖表单类中的loadDefaultDecorators:

public function loadDefaultDecorators() {
     $this->setDecorators(
         array(
             array('ViewScript', 
                 array('viewScript' => 'foo/bar.phtml')
             )
          )
      );        
} 
Run Code Online (Sandbox Code Playgroud)

这将引用位于/ views/scripts/foo中的名为bar.phtml的ViewScript.请注意上面"ViewScript"和"viewScript"中区分大小写的区别.

接下来,您将不得不调整应用于每个元素的装饰器以确保它显示但没有烦人的dt/dd包装器.例如:

$baz = new Zend_Form_Element_Text('bazInput');
$baz->setDecorators(array('ViewHelper','Errors')); 
Run Code Online (Sandbox Code Playgroud)

最后,您需要构建ViewScript,例如:

<form method="post" action="<?php echo $this-element->getAction() ?>">
    <table>
        <tr>
            <td><label for="bazInput">Baz:</label></td>
            <td><?php echo $this->element->bazInput ?></td>
        </tr>
    </table>
    <input type="submit" value="Submit Form" />
</form>
Run Code Online (Sandbox Code Playgroud)

显然这是一个非常简单的例子,但它说明了如何引用表单元素和表单操作.

然后在您的视图中,像往常一样引用并输出您的表单.通过这种方式,您可以更好地控制表单布局 - 包括轻松添加Javascript.

我相信这种方法可以解决您的要求:您可以使用纯HTML构建表单,并仍然可以利用Zend Form验证机制.


lo_*_*fye 9

在过去的10个月里,我一直在使用尽可能多的Zend组件,在一个大型项目中,Zend_Form一直是***中最大的痛苦.表单渲染速度慢,难以制作.甚至不要让我开始使用子表单.我看到一篇名为" scaling zend_form " 的有趣文章,但它似乎对渲染速度没有太大帮助:(

我正在考虑在视图中使用直接HTML制作所有表单,并且仅使用Zend_Form进行验证和过滤(不渲染).或者,或者我将只使用Zend_Validate和Zend_Filter,而不使用Form方面.

工具只是帮助您的工具.否则,这只是一个障碍.

  • 这正是我的经历.感谢您的确认,这可能不仅仅是因为我的愚蠢使得这很麻烦:) (3认同)