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

2022-08-30 20:33:22

我目前正在开发一个非常大的应用程序,其中包含许多表单。

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

然而,我不断偶然发现越来越多的问题,这些问题涉及(缺乏)灵活性,导致Zend_Form_Decorator。简单的任务,如向单个输入元素添加额外的按钮,成为非常困难的任务。

我现在已经到了认真考虑完全放弃Zend_Form_Element+ Zend_Form_Decorator方法的地步,但我不想失去出色的验证选项。

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

  • 以最终用户看到的方式编写表单:以纯 HTML 格式
  • 轻松将服务器端验证添加到表单字段,而不会过多地破坏采埃孚标准行为

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

是否有任何准则可以做到这一点?你们中是否有人经历过同样的事情,如果是这样,你们是如何解决这些问题的?

我非常想听听你的看法。


答案 1

我也发现默认的装饰器是一个巨大的痛苦。我理解为什么他们是这样的,但我认为“不便因素”被严重低估了。

无论如何,我建议对表单使用ViewScripts。请注意,这些视图与视图不同 -- 相反,ViewScript 在 Form 类中显式引用,充当各种“子视图”,并允许您控制每个元素的布局。过去很难找到如何使用ViewScripts的示例,但是我将尝试尝试提供一些有用的东西。

首先,在窗体类中重写 loadDefaultDecorators:

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

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

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

$baz = new Zend_Form_Element_Text('bazInput');
$baz->setDecorators(array('ViewHelper','Errors')); 

最后,您需要构建 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>

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

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

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


答案 2

在过去的10个月里,我一直在一个大型项目中使用尽可能多的Zend组件,Zend_Form一直是***中最大的痛苦。这些表单渲染速度慢,而且很难变得漂亮。甚至不要让我开始使用子表单。我看到了一篇有趣的文章,名为“缩放zend_form”,但它似乎对渲染速度没有多大帮助:(

我正在考虑在视图中使用直接的HTML制作所有表单,并且仅使用Zend_Form来执行验证和筛选(不呈现)。要么这样,要么我只使用Zend_Validate和Zend_Filter,根本没有形式方面。

工具只有在对您有帮助时才是工具。否则,这只是一个障碍。


推荐