ZF中的Zend_Forms和装饰器 - 在一个容器中显示标签,输入和错误

时间:2011-10-22 19:53:11

标签: model-view-controller zend-framework zend-form zend-form-element zend-decorators

在Zend Framework中装饰器的设计非常糟糕。 我今天花了很多时间和其他几天试图弄清楚如何做一些应该是简单的前端任务。

我认为Zend_Forms和装饰器是ZF中最糟糕的部分,因为后端和前端没有正确分离。为什么表单类规定了应该如何打印HTML?

我正在寻找的是simple之类的东西:

<div class="labeledField">
    <label for="username">Username</label>
    <input type="text" id="username" name="username" />
</div>
<div class="labeledField">
    <label for="password">Password</label>
    <input type="password" id="password" name="password" />
</div>

我想要这样的原因是因为我希望标签位于字段顶部,如:

[Username       ]
[Password       ]

这样我可以在选择输入时使标签稍微褪色,但在选择输入时仍然保留。使用JS时,当输入框包含任何内容时,标签将被隐藏。此功能存在于Apple购物车中。

我喜欢Zend_form的验证部分,如果后端代码没有规定HTML的外观,我很想知道它如何放在前端。

在我看来,它应该采用一个模板(来自可以访问/ views /文件夹的前端,或者我应该能够做到这样的事情:

<div class="labeledField">
    <?php
    echo $this->form->username->getLabel();
    echo $this->form->username->getElement();
    $errors = $this->form->username->getErrors();
    if (sizeof($errors) > 0) {
        ?>
        <div class="errors">
        <?php
        foreach($errors as $error) {
            ?>
            <li><?php echo $error ?></li>
            <?php
        } 
        ?>
        </div>
        <?php
    }
    ?>
</div>

但是,模板将允许我回显$ this-&gt;表格并让它使用上面的格式我想要的字段。

1 个答案:

答案 0 :(得分:2)

毫无疑问,装饰者可能需要一些时间来适应。让我来回答/回答你的一些问题:

  

在Zend Framework中装饰器的设计非常糟糕。我今天花了很多时间和其他几天试图弄清楚如何做一些应该是简单的前端任务。

是的,这是一个奇迹,我有任何头发留下。

  

我认为Zend_Forms和装饰器是ZF最糟糕的部分,因为后端和前端没有正确分开。为什么表单类规定了应该如何打印HTML?

我同意你的看法,表单是如何呈现的是一个表示问题,所以它可能更多与视图相关。如果您真的想要分离问题,可以创建未修饰的表单,然后在视图脚本中添加装饰器,也许使用一些自定义视图助手。这对我来说最有意义,虽然我承认我从来没有费心去做。

有关在单独表单上设置装饰器的独立类的示例,请查看EasyBib_Form_DecoratorUsing Zend_Form without Zend Framework MVC

  

在我看来,它应该采用一个模板(来自可以访问/ views /文件夹的前端,或者我应该能够做到这样的事情:

您使用ViewScript decorator几乎确实拥有该功能。

$form->setDecorators(array(
    array('ViewScript', array(                      // note case
        'viewScript' => '_partials/forms/my.phtml', // note case
)));

也就是说,使用标准装饰器,你想要的标记相对简单:

// not tested, but should be pretty close
$element->setDecorators(array(
   'ViewHelper',
   'Label',
   'Errors',
   array('HtmlTag', array('tag' => 'div', 'attribs' => array('class' => 'labeledField'))),
));

当然,对表单的任何特殊样式或客户端操作(例如,您引用的Apple购物车效果)都可以在客户端分层到此标记。