Zend Framework:如何删除Zend Form Hidden Element上的装饰器?

时间:2009-01-26 23:51:46

标签: zend-framework zend-form zend-decorators

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

<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">

我怎样才能做到这一点?

11 个答案:

答案 0 :(得分:50)

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

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

这将只渲染输入字段,没有Dt-Dd包装和标签。

答案 1 :(得分:32)

来自Zend Element Decorators文档:

  

默认装饰器不需要   装载

     

默认情况下,默认装饰器是   在对象初始化期间加载   你可以通过传递来禁用它   'disableLoadDefaultDecorators'选项   到构造函数:

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

答案 2 :(得分:24)

我用这个

$element->removeDecorator('DtDdWrapper');

去掉特定元素周围的dt dd标签

答案 3 :(得分:6)

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

/**
 * 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);
}

答案 4 :(得分:5)

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

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

答案 5 :(得分:4)

正如其他帖子setDisableLoadDefaultDecorators(true)中提到的那样,如果它们已经加载了就行不通......但是clearDecorators()会这样做!

答案 6 :(得分: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" />
...

答案 7 :(得分:2)

答案 8 :(得分:2)

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

中的子表单中

答案 9 :(得分: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);
    }
}

答案 10 :(得分:0)

使用此:

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

        $decorator = $element->getDecorator('label');
        if (!$decorator) {
            continue;
        }
        $decorator->removeOption('tag');
    }