50

我正在尝试删除隐藏表单元素上的默认装饰器。默认情况下,隐藏元素显示如下:

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

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

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

我怎样才能做到这一点?

4

11 回答 11

51

对于隐藏字段,您只需要一个装饰器 - ViewHelper:

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

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

于 2010-12-07T14:08:06.657 回答
32

来自Zend Element Decorators文档:

不需要加载默认装饰器

默认情况下,默认装饰器在对象初始化期间加载。您可以通过将 'disableLoadDefaultDecorators' 选项传递给构造函数来禁用此功能:

$element = new Zend_Form_Element('foo', 
    array('disableLoadDefaultDecorators' => true)
);
于 2009-01-27T00:15:39.293 回答
24

我用这个

$element->removeDecorator('DtDdWrapper');

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

于 2009-02-10T22:15:23.063 回答
6

// 基于上面 - 一个简单的函数来添加一个隐藏元素到 $this 表单

/**
 * 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);
}
于 2009-03-07T15:13:29.907 回答
6

当您有很多隐藏输入时,最佳答案如下:

$elements = $this->getElements();
foreach ($elements as $elem)
    if ($elem instanceof Zend_Form_Element_Hidden)
        $elem->removeDecorator('label')->removeDecorator('HtmlTag');
于 2010-09-24T12:04:37.077 回答
5

正如其他帖子中提到的那样,setDisableLoadDefaultDecorators(true)如果它们已经加载clearDecorators()则不起作用......但是可以!

于 2010-07-13T13:46:06.127 回答
3

我无法让 disableLoadDefaultDecorators 正常工作。这是我想出的解决方案。

$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" />
...
于 2009-02-06T18:11:26.520 回答
2

这是来自http://www.phpfreaks.com/forums/index.php?topic=225848.0的 takeme2web 建议

$yourhiddenzendformelement->setDecorators(array('ViewHelper'));

于 2010-07-24T23:56:47.400 回答
2

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

于 2010-12-14T22:21:09.153 回答
2

好吧,2012年仍然是同样的问题。如果您删除装饰器,则 html 将无法验证。如果你离开它们,隐藏的元素会占用空间。在我所有的项目中,我都有一个 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);
    }
}
于 2012-07-31T17:32:24.733 回答
0

用这个:

    foreach ($this->getElements() as $element) {

        $decorator = $element->getDecorator('label');
        if (!$decorator) {
            continue;
        }
        $decorator->removeOption('tag');
    }
于 2015-02-09T11:47:02.410 回答