【问题标题】:Zend Framework: How do I remove the decorators on a Zend Form Hidden Element?Zend 框架:如何删除 Zend 表单隐藏元素上的装饰器?
【发布时间】:2009-01-26 23:51:45
【问题描述】:

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

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

我怎样才能做到这一点?

【问题讨论】:

  • 这实际上是一个不同的问题,但非常相似。
  • 阅读实际问题 - 是一样的。
  • 如果你只有一个装饰器,删除所有和删除一个装饰器可能是一样的,但如果你有多个装饰器,那就不一样了。
  • 回答了这个问题here

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


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    来自Zend Element Decorators 文档:

    不需要默认装饰器 已加载

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

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

    【讨论】:

    • 好用!我使用它就像 $this->addElement('hidden','article_id', array('disableLoadDefaultDecorators' => true));在我的 init 方法中。
    • 使用这个解决方案,&lt;input type="hidden"&gt; 字段对我来说根本不显示。
    【解决方案3】:

    我用这个

    $element->removeDecorator('DtDdWrapper');
    

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

    【讨论】:

      【解决方案4】:

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

      /**
       * 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】:

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            我无法让 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" />
            ...
            

            【讨论】:

            • 这种方法的问题在于它不兼容 xhtml
            【解决方案8】:

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

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                【解决方案10】:

                嗯,2012 年还是同样的问题。如果您删除装饰器,则 html 将无法验证。如果你离开它们,隐藏的元素会占用空间。在我所有的项目中,我都有一个 CSS 助手 .hidden,所以我只需将它应用到 &lt;dd&gt; 并取消设置标签:

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

                【讨论】:

                  【解决方案11】:

                  使用这个:

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

                  【讨论】:

                    猜你喜欢
                    • 2011-05-20
                    • 2011-07-13
                    • 1970-01-01
                    • 2011-03-25
                    • 1970-01-01
                    • 2011-08-08
                    • 2013-07-25
                    • 1970-01-01
                    • 2011-07-09
                    相关资源
                    最近更新 更多