Zend Form:我如何让它屈服于我的意志?

2022-08-30 11:54:27

我读过很多次手册,我搜索了谷歌提供的关于这个主题的帖子,我甚至买了几本关于采埃孚的书。现在,为什么我仍然感到困惑?

我可以使用Zend_Form,制作一个可以验证和运行良好的表单。我无法做到的是,它使表单看起来与我希望它具有的错误消息完全一样。我想要自定义按钮,我想要时髦的布局,我想在表单中间插入文本,等等。

有没有人有一个简单的方法来实现这些事情?有什么东西让我觉得框架是在为我节省时间而不是成本?我可以放弃Zend Form...制作我自己的表单,让它的操作点击一个页面来验证和处理发布的数据,我可以尽可能快地输入它,但我真的想“得到”这个,并能够使用它,因为它显然是有意的。

有什么建议吗?对于自定义按钮,时髦的布局和基本(或者更高级,因为有大量的基本教程跳过了更难的问题)的任何简单的“如何”使用zend形式“完成工作”?


答案 1

巴雷特·康拉德的建议是我建议的。此外,请记住,您不需要使用表单对象来呈现表单。

您可以做的一件事是在视图脚本中创建一个表单,其中包含与表单类同名的元素。

您的 HTML 表单:

<form action="/login/" method="post">
<fieldset>
    <label for="username">Username:</label>
    <input type="text" size="10" name="username" />
    <label for="password">Password:</label>
    <input type="password" size="10" name="password" />
    <input type="submit" />
</fieldset>
</form>

您的班级:

class LoginForm extends Zend_Form
{
    public function init()
    {
        $username = $this->createElement('text','username');
        $username->setRequired(true);
        $this->addElement($username);

        $password = $this->createElement('password','password');
        $password->setRequired(true);
        $this->addElement($password);        
    }
}

表单类反映您的 HTML 表单,类中的每个元素都有自己的验证器和要求。回到您的操作中,您可以创建表单类的实例,并针对该表单验证您的post/get vars:

$form = new LoginForm();
if ($this->_request->isPost()) {
    if ($form->isValid($this->_request->getParams())) {
        // do whatever you need to do
    } else {
        $this->view->errors = $form->getMessages();
    }
}

您可以使用此方法在一个组中显示窗体顶部的错误消息。

这是一个基本示例,但它允许您完全控制窗体的呈现方式,而无需花时间学习使用装饰器。在我看来,Zend_Form的大部分优势在于其验证和过滤属性。这给了你这种力量。像这样的解决方案的主要缺点是,您的视图脚本 HTML 表单可能会与表单类不同步。


答案 2

在视图中单独呈现每个元素 - 例如

<!-- view script here -->
<form method="POST">
Name: <?php echo $this->myForm->getElement('name')->render(); ?>
some other text between the fields
Birthdate: <?php echo $this->myForm->getElement('birthdate')->render(); ?>
<input type="submit" />
</form>

这保留了使用Zend_Form视图帮助程序的能力(即,在验证失败时显示错误消息并维护表单字段的值),但为您提供了完全的自定义功能。

如果您想更进一步,请关闭各个表单元素的默认装饰器,然后附加自己的装饰器以进一步准确自定义使用的标签(即错误消息和标签),或者根本不使用装饰器(除了呈现表单元素本身),然后手动编写所有周围的HTML。完整的自定义功能,而不会在窗体级别和视图级别失去Zend_Form的优势。


推荐