4

我有一个像这样扩展 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 => 'li'。

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

4

5 回答 5

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'));
        }
    }
于 2008-12-18T11:21:53.833 回答
3

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

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

显然,视图不是执行此操作的理想位置,但您明白了。请注意,调用 setDecorator***s***() 会重置所有装饰器,而不是添加一个新装饰器。

于 2008-12-17T23:54:31.367 回答
3

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

恕我直言,这是采埃孚的错误设计决定。我的意思是,说输入的值是“术语”的“定义”在语义上是一个可爱的想法,但它并没有经过深思熟虑。

同样的问题:Zend 框架:如何删除 Zend 表单隐藏元素上的装饰器?

于 2009-06-28T17:10:36.070 回答
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>标签正常。

于 2011-05-11T03:09:00.490 回答
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);

来源

于 2011-01-08T18:13:08.517 回答