Zend Framework - Zend_Form装饰器问题

时间:2008-12-17 22:00:03

标签: php zend-framework zend-form

我有一个扩展Zend_Form的类(简化):

class Core_Form extends Zend_Form
{
    protected static $_elementDecorators = array(
        'ViewHelper',
        'Errors',
        array('Label'),
        array('HtmlTag', array('tag' => 'li')),
    );  

    public function loadDefaultDecorators()
    {
        $this->setElementDecorators(self::$_elementDecorators);
    }
}

然后我使用该类创建我的所有表单:

class ExampleForm extends Core_Form
{
    public function init()
    {
        // Example Field
        $example = new Zend_Form_Element_Hidden('example');
        $this->addElement($example);
    }
}

在我的一个视图中,我需要只显示 这一个字段(没有Zend_Form生成的任何其他内容)。所以在我看来,我有这个:

<?php echo $this->exampleForm->example; ?>

这样可以正常工作,除非它生成如下字段:

<li><input type="hidden" name="example" value=""></li>

这显然是因为我将元素装饰器设置为包含HtmlTag:tag =&gt; '礼'。

我的问题是:如何禁用此元素的所有装饰器。我不需要装饰器来隐藏输入元素。

5 个答案:

答案 0 :(得分:5)

设置它的最佳位置是公共函数loadDefaultDecorators()

例如:

class ExampleForm extends Core_Form
    {
        public function init()
        {
            //Example Field
            $example = new Zend_Form_Element_Hidden('example');
            $this->addElement($example);
        }

        public function loadDefaultDecorators()
        {
            $this->example->setDecorators(array('ViewHelper'));
        }
    }

答案 1 :(得分:3)

将表单元素的装饰器重置为仅使用“ViewHelper”。例如:

<?php echo $this->exampleForm->example->setDecorators(array('ViewHelper')) ; ?>

显然,这个观点不是理想的做法,但你明白了。请注意,调用setDecorator *** s ***()会重置所有装饰器,而不是添加新装饰器。

答案 2 :(得分:3)

如果你在隐藏元素上禁用dd / dt装饰器,你将拥有无效的XHTML,因为你的某些东西不是dl中的有效项。唯一的解决方案是在所有表单元素上禁用这些装饰器,而不仅仅是隐藏的元素,并在整个表单上禁用它们。为了保持一致性,您需要在所有表单中执行此操作。

恕我直言,这是ZF的一个糟糕的设计决定。我的意思是说,输入的值是“术语”的“定义”在语义上是一个可爱的想法,但它没有完全考虑。

同样的问题:Zend Framework: How do I remove the decorators on a Zend Form Hidden Element?

答案 3 :(得分:1)

如果您打算以这种方式添加元素:

$this->addElement(
  'text',
  'a1',
  array('required' => true, 'validators' => array('Alpha'))
);

您可以使用以下内容获取每个元素的dd/dt标记:

$this->setElementDecorators(array('ViewHelper'));

或者如果您想以其他方式添加元素:

$nombre1 = new Zend_Form_Element_Text(
          'n1', 
          array('id'=> 'Nombre1', 'validators' => array('Alpha') )
            );
//$nombre1->setDecorators(array('ViewHelper'));
$this->addElement($nombre1);

您需要取消注释:

//$nombre1->setDecorators(array('ViewHelper'));

以禁用dd/dt标记。 最后一种方法是禁用当前元素,表单中的其他元素保持<dd> <dt>标记正常。

答案 4 :(得分:0)

这就是我的所作所为:

class M_Form_Element_Hidden extends Zend_Form_Element_Hidden {
   public function init() {
      $this->setDisableLoadDefaultDecorators(true);
      $this->addDecorator('ViewHelper');
      $this->removeDecorator('DtDdWrapper');
      $this->removeDecorator('HtmlTag');
      $this->removeDecorator('Label');
      return parent::init();
   }
}

然后在你的表格中,

$element = new M_Form_Element_Hidden('myElement');
$this->addElement($element);

Source