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'); }