Zend表装饰器麻烦

Dec*_*ler 4 zend-framework decorator zend-form

如何使用表单元素的表单装饰器实现以下功能:

<dt>
  <ul>
    <li>The errors</li>
    <li>The errors</li>
  </ul>
  <label>The label</label>
</dt>
<dd>
  <input type="text" value="The input field">
</dd>
Run Code Online (Sandbox Code Playgroud)

换句话说,我想要在Label之前添加前缀,而不是在输入字段之后附加的错误.我不过要保持<dt><dd>标签如上图所示.

Dec*_*ler 5

好吧,我发现了怎么做.装饰师逐渐开始对我有意义:

$decorators = array(
 'Label',
 array( 'Errors', array( 'placement' => 'prepend' ) ),
 array( array( 'dt' => 'HtmlTag' ), array( 'tag' => 'dt' ) ),
 array( array( 'ddOpen' => 'HtmlTag' ), array( 'tag' => 'dd', 'openOnly' => true, 'placement' => 'append' ) ),
 array( 'ViewHelper' ),
 array( array( 'ddClose' => 'HtmlTag' ), array( 'tag' => 'dd', 'closeOnly' => true, 'placement' => 'append' ) )
);
Run Code Online (Sandbox Code Playgroud)

这样做有以下几点:

  1. 首先渲染标签
  2. 然后prepend(default = append)错误
  3. 换行(默认)HtmlTag(dt)中的所有先前内容
  4. 接下来,追加(默认=换行)一个开头的HtmlTag(dd)
  5. 然后追加(默认)ViewHelper
  6. 接下来,追加(默认=换行)关闭HtmlTag(dd)

然后设置装饰器:

// be sure to only set them, after you have added the relevant elements to the form
$this->setElementDecorators( $decorators );
Run Code Online (Sandbox Code Playgroud)

PS:
请注意,虽然我的特定示例生成了invaliid html.;-)我后来才发现<ul>元素中不允许使用<dt>元素DOCTYPE HTML 4.01 strict