3

UPD:已解决 - 添加了额外的装饰器。

我需要有以下结果:

<dd id="daily_722-element">
    <input id="daily_722" type="checkbox" name="daily_722" value="1">
    <span> some text </span>
</dd>

我需要在复选框之后使用 html 标签包裹“一些文本”,但在 /DD 之前(不是之后)!

我目前的代码如下:

$chk = new Zend_Form_Element_Checkbox('daily_shit');
$chk->setLabel('<span class="dt-note">'. $firstName. '</span>');
$chk->getDecorator('label')->setOption('escape', false);

所以它产生:

<dd id="daily_722-element">
<input id="daily_722" type="checkbox" name="daily_722" value="1">
</dd>

而且我不知道如何在复选框之后注入额外的 HTML ......但在 DD 里面

4

2 回答 2

2

ZF1 装饰器是一个已知的混淆源。如果您付出一点努力并了解他们如何构建生成的 HTML,那么实现您想要的非常简单。

我想您还没有覆盖 ZF 的表单元素默认装饰器。然后它们是(记住它们是按顺序执行的,改变了先前装饰器返回的内容):

  • ViewHelper(呈现输入本身)
  • 错误(如果需要,附加错误消息)
  • 描述(附加元素描述,如果设置)
  • HtmlTag(用 dd 包围)
  • 标签(以 dt 包裹的标签开头)

现在您需要<span> some text </span>在输入(或错误/描述)之后添加,但在它被dd. 这意味着应该将新的装饰器添加到正确位置的现有装饰器链中。

$chk = new Zend_Form_Element_Checkbox('daily_shit');
$chk->setLabel('<span class="dt-note">firstName</span>');
$chk->getDecorator('label')->setOption('escape', false);

// Create a new decorator to render span you need
$postCheckboxDecorator = new Zend_Form_Decorator_Callback(
    array(
        'callback' => function () {
            return '<span>some text</span>';
        }
    )
);

// Add it into existing chain of decorators, right after ViewHelper
$decorators = $chk->getDecorators();
$decorators = array_slice($decorators, 0, 1, true) +
    array('PostCheckboxDecorator' => $postCheckboxDecorator) +
    array_slice($decorators, 1, count($decorators) - 1, true);

// Replace element's decorators with a modified chain
$chk->setDecorators($decorators);
于 2016-05-15T02:08:00.350 回答
1

您可以为此编写自定义装饰器。方法render接收原始内容并对其进行更改,然后返回更改的内容。

class MyDecorator extends Zend_Form_Decorator_Abstract
{
    public function render($content)
    {
        return $content . $this->_options['content'];
    }
}

并将其用于表单构建

$form = new Zend_Form();

$chk = new Zend_Form_Element_Checkbox('daily_shit');
$chk->setLabel('<span class="dt-note">maxa</span>');
$chk->getDecorator('label')->setOption('escape', false);

$decorators = $chk->getDecorators();
$chk->clearDecorators();
$chk->addDecorator($decorators['Zend_Form_Decorator_ViewHelper']);
$chk->addDecorator(new MyDecorator(array('content' => '<span> some text </span>')));
$chk->addDecorator($decorators['Zend_Form_Decorator_Errors']);
$chk->addDecorator($decorators['Zend_Form_Decorator_Description']);
$chk->addDecorator($decorators['Zend_Form_Decorator_HtmlTag']);
$chk->addDecorator($decorators['Zend_Form_Decorator_Label']);

$form->addElement($chk);
于 2016-05-14T08:58:48.967 回答