【问题标题】:Zend Forms (ZF1) How to add extra HTML after checkbox inside DDZend Forms (ZF1) 如何在 DD 中的复选框后添加额外的 HTML
【发布时间】:2016-09-08 18:19:45
【问题描述】:

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

我需要得到以下结果:

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

我需要将 "some text" 用 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 中

【问题讨论】:

    标签: php html zend-framework zend-form-element zend-form-collection


    【解决方案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);
    

    【讨论】:

    • 谢谢,成功了!刚刚包装了装饰器。 $chk->clearDecorators(); foreach($decorators as $key => $decorator){ $chk->addDecorator($decorators[$key]); if ($key === 'Zend_Form_Decorator_ViewHelper'){ $chk->addDecorator(new Decorator_Admin_HtmlTagSuffix(array('content' => ' site: '.$some_meaningful_text.''))); } }
    【解决方案2】:

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

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

    • ViewHelper(呈现输入本身)
    • 错误(如果需要,附加错误消息)
    • 描述(附加元素描述,如果已设置)
    • HtmlTag(用 dd 括起来)
    • 标签(前面带有 dt 包裹的标签)

    现在您需要在输入(或错误/描述)之后添加&lt;span&gt; some text &lt;/span&gt;,但在它被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);
    

    【讨论】:

    • 谢谢,Max,你提高了我的知识水平 :) 无论如何,周五晚上 4 点,一切似乎都成了问题 :)
    猜你喜欢
    • 1970-01-01
    • 2015-10-19
    • 2011-02-03
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 1970-01-01
    • 2010-11-30
    • 1970-01-01
    相关资源
    最近更新 更多