Zend Framework:如何删除Zend表单隐藏元素上的装饰器?

我试图删除隐藏的窗体元素上的默认装饰。 默认情况下,隐藏元素显示如下:

<dt>Hidden Element Label (if I had set one)</dt> <dd><input type="hidden" name="foobar" value="1" id="foobar"></dd> 

我不希望我的隐藏元素占用我的页面空间。 我想删除所有默认的装饰器,所以我只剩下了input标签。

 <input type="hidden" name="foobar" value="1" id="foobar"> 

我怎样才能做到这一点?

对于隐藏的领域,你只需要一个装饰器 – ViewHelper:

 $field = new Zend_Form_Element_Hidden('id'); $field->setDecorators(array('ViewHelper')); 

这将只呈现input字段,没有Dt-Dd包装和标签。

从Zend Element Decorators文档:

缺省装饰器不需要加载

默认情况下,默认的装饰器在对象初始化时加载。 您可以通过将“disableLoadDefaultDecorators”选项传递给构造函数来禁用它:

 $element = new Zend_Form_Element('foo', array('disableLoadDefaultDecorators' => true) ); 

我用这个

 $element->removeDecorator('DtDdWrapper'); 

摆脱特定元素周围的dt dd标签

//基于上面 – 一个简单的函数来添加一个隐藏元素到$这个forms

 /** * Add Hidden Element * @param $field * @param value * @return nothing - adds hidden element * */ public function addHid($field, $value){ $hiddenIdField = new Zend_Form_Element_Hidden($field); $hiddenIdField->setValue($value) ->removeDecorator('label') ->removeDecorator('HtmlTag'); $this->addElement($hiddenIdField); } 

当你有很多隐藏的input时,最好的答案如下:

 $elements = $this->getElements(); foreach ($elements as $elem) if ($elem instanceof Zend_Form_Element_Hidden) $elem->removeDecorator('label')->removeDecorator('HtmlTag'); 

正如在其他post中提到的setDisableLoadDefaultDecorators(true)不工作,如果他们已经加载…但clearDecorators()呢!

我无法使disableLoadDefaultDecorators正常工作。 这是我提出的一个解决scheme。

 $hiddenIdField = new Zend_Form_Element_Hidden('id'); $hiddenIdField->setValue($portalId) ->removeDecorator('label') ->removeDecorator('HtmlTag'); 

在HTML中,隐藏的字段在其周围没有任何额外的标签。

 ... <dt><label for="password" class="required">Password</label></dt> <dd><input type="password" name="password" id="password" value="" /></dd> <input type="hidden" name="id" value="1" id="id" /> ... 

这里是从http://www.phpfreaks.com/forums/index.php?topic=225848.0build议takeme2web

$ yourhiddenzendformelement-> setDecorators(arrays( '视图助手'));

如果您仍然使用<dl>包装器,只使用一个“ViewHelper”装饰器将会生成无效的标记。 ZF-2718概述了另一种方法。 这将隐藏的字段添加到包装在<dd>的子窗体中。

那么,2012年,仍然是同样的问题。 如果你删除了装饰器,html将不会被validation。 如果你离开他们,隐藏的元素占据空间。 在我的所有项目中,我都有一个CSS助手.hidden,所以我只是将它应用到<dd>并取消设置标签:

 $element = new Zend_Form_Element_Hidden('foo', array('value' => 'bar')); $element->removeDecorator('Label'); $element->getDecorator('HtmlTag')->setOption('class', 'hidden'); 

有效的HTML(5),漂亮的外观。 这也可以进入隐藏字段的自定义装饰器。

编辑

这是我如何把它放入我自己的表单元素:

 class Exanto_Form_Element_Hidden extends Zend_Form_Element_Hidden { public function render(Zend_View_Interface $view = null) { $this->removeDecorator('Label'); $this->getDecorator('HtmlTag')->setOption('class', 'hidden'); return parent::render($view); } } 

用这个:

  foreach ($this->getElements() as $element) { $decorator = $element->getDecorator('label'); if (!$decorator) { continue; } $decorator->removeOption('tag'); } 
Interesting Posts