Zend框架:如何移除Zend表单隐藏元素上的修饰符?

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

我该如何实现这个?


同样的问题:https://dev59.com/dEbRa4cB1Zd3GeqPwgh2 - leek
这实际上是一个不同的问题,但非常相似。 - Andrew
阅读实际问题 - 它是相同的。 - leek
如果你只有一个装饰器,那么删除所有装饰器和删除一个装饰器可能是相同的,但如果你有多个装饰器,它们就不同了。 - d-_-b
在这里回答了这个问题:[https://dev59.com/dEbRa4cB1Zd3GeqPwgh2#4635352] - Stephen Fuhry
11个回答

51

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

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

这将仅呈现输入字段,不包括Dt-Dd包装器和标签。


32

Zend元素修饰符文档中:

默认的修饰符不需要被加载

默认情况下,在对象初始化期间会加载默认修饰符。您可以通过向构造函数传递“disableLoadDefaultDecorators”选项来禁用此功能:

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

3
方便!我在我的初始化方法中使用了它,像这样: $this->addElement('hidden','article_id', array('disableLoadDefaultDecorators' => true)); - Adam Benzan
3
使用这种解决方案,对我来说<input type="hidden">字段根本不显示。 - BenMorel

24

我使用这个

$element->removeDecorator('DtDdWrapper');

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


6
当您有大量隐藏的输入时,最好的解决方案如下:
$elements = $this->getElements();
foreach ($elements as $elem)
    if ($elem instanceof Zend_Form_Element_Hidden)
        $elem->removeDecorator('label')->removeDecorator('HtmlTag');

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

5

如其他帖子所述,如果默认的装饰器已被加载,setDisableLoadDefaultDecorators(true)无效......但是clearDecorators()有效!


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

2
这种方法的问题在于它不符合XHTML标准。 - Andrew

2
仅使用一个“ViewHelper”修饰器将在仍使用<dl>包装器时生成无效的标记。另一种方法在ZF-2718中进行了说明。这会向子窗体添加隐藏字段,该子窗体包裹在<dd>中。

2

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接