Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Zend Forms(ZF1)如何在DD内的复选框后添加额外的HTML_Php_Html_Zend Framework_Zend Form Element_Zend Form Collection - Fatal编程技术网

Php Zend Forms(ZF1)如何在DD内的复选框后添加额外的HTML

Php Zend Forms(ZF1)如何在DD内的复选框后添加额外的HTML,php,html,zend-framework,zend-form-element,zend-form-collection,Php,Html,Zend Framework,Zend Form Element,Zend Form Collection,UPD:已解决 -增加了额外的装饰 我需要得到以下结果: <dd id="daily_722-element"> <input id="daily_722" type="checkbox" name="daily_722" value="1"> <span> some text </span> </dd> 一些文本 我需要在复选框之后,但在/DD之前(而不是之后),用html标记包装“一些文本” 我目前的代码如下:

UPD:已解决 -增加了额外的装饰

我需要得到以下结果:

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

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

我目前的代码如下:

$chk = new Zend_Form_Element_Checkbox('daily_shit');
$chk->setLabel('<span class="dt-note">'. $firstName. '</span>');
$chk->getDecorator('label')->setOption('escape', false);
$chk=new Zend_Form_Element_复选框('daily_shit');
$chk->setLabel('.$firstName'');
$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中,您可以为此编写自定义装饰程序。方法
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);
$form=new Zend_form();
$chk=新Zend_表单_元素_复选框('daily_shit');
$chk->setLabel('maxa');
$chk->getDecorator('label')->setOption('escape',false);
$decorators=$chk->getDecorators();
$chk->clearDecorators();
$chk->addDecorator($decorators['Zend_Form_Decorator_ViewHelper']);
$chk->addDecorator(新的MyDecorator(数组('content'=>'sometext'));
$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);

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

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

  • ViewHelper(渲染输入本身)
  • 错误(如果需要,附加错误消息)
  • 说明(如果设置,则附加元素说明)
  • HtmlTag(用dd包围)
  • 标签(用dt包裹的标签进行包装)
现在您需要的是在输入(或错误/描述)之后添加
一些文本,但在它被
dd
包装之前。这意味着新的decorator应该添加到现有decorator链的正确位置

$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);
$chk=new Zend_Form_Element_复选框('daily_shit');
$chk->setLabel('firstName');
$chk->getDecorator('label')->setOption('escape',false);
//创建一个新的装饰器以呈现所需的范围
$postCheckboxDecorator=新Zend\u表单\u Decorator\u回调(
排列(
“回调”=>函数(){
返回“一些文本”;
}
)
);
//将其添加到现有的装饰器链中,就在ViewHelper之后
$decorators=$chk->getDecorators();
$decorators=array\u切片($decorators,0,1,true)+
数组('PostCheckboxDecorator'=>$PostCheckboxDecorator)+
数组_切片($decorators,1,count($decorators)-1,true);
//用修改过的链替换元素的装饰器
$chk->setDecorators($decorators);

谢谢,成功了!刚刚结束了装修$chk->clearDecorators();foreach($key=>$decorator){$chk->addDecorator($key]);if($key==='Zend_Form_decorator_ViewHelper'){$chk->addDecorator(new decorator_Admin_HtmlTagSuffix(数组('content'=>'站点:'.$some有意义的文本'));}谢谢,Max,你把我的知识设置了一点:)无论如何,周五早上4点,一切似乎都很麻烦:)