Zend装饰器 - 删除DT包装器的Id字段

时间:2010-08-03 14:25:57

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

我有两种形式,他们共享一些ID,因为两个输入字段称为“标题”。

Zend为我生成了一个很好的输出:

<dl class="zend-form">
  <dt id="title-label">
    <label for="form1-title" class="required">Description</label>
  </dt>
  <dd id="title-element">
    <input name="form1[title]" id="form1-title" value="..." type="text">
  </dd>
</dl>

现在问题是dt和dd元素被命名为错误(应该是form1-title-lable,因为这是一个子表单)。

我也尝试更改元素装饰器:

$this->addElements( ... );
$this->setElementDecorators(array(
        'ViewHelper',
        'Errors',
        array(array('data' => 'HtmlTag'),array( 'tag' => 'dd', 'class' => 'element' )),
        array(array('data' => 'Label'),array( 'tag' => 'dt', class=> 'label' ))
  ));

但结果并不像预期的那样。

标签已添加到我的提交按钮和 dt元素的ID仍在那里。

如何删除id属性?


编辑 - 元素声明:

    $titel = new Zend_Form_Element_Text('title');
    $titel->setLabel( "Title" )
          ->addValidator('NotEmpty', true)
          ->addValidator('stringLength',true, array(0, 255 ))
          ->setRequired(true)
          ->addFilter("Alnum", array(true))
          ->addFilter('StringTrim');

    $this->addElement($titel);

2 个答案:

答案 0 :(得分:1)

听起来更像问题在于您的子表单中没有将其名称添加到ID之前。如果您解决了这个问题,那么您将无需删除ID。

但是,如果你想使用DtDdWrapper装饰器从元素中删除ID,你可以这样做。

class Form_Foo extends Zend_Form_SubForm
{
    public function init()
    {

        $title = new Zend_Form_Element_Text('foo_title');
        $title->setLabel('Title');
        $title->removeDecorator('DtDdWrapper');
        $title->addDecorator(new Decorator_Foo());      
        $this->addElement($title);
    }
}

class Decorator_Foo extends Zend_Form_Decorator_DtDdWrapper
{
    public function render($content)
    {
        return '<dt>&nbsp;</dt>' .
               '<dd>' . $content . '</dd>';
    }
}

这应该为你提供没有ID标签的元素。

答案 1 :(得分:0)

您可以创建自定义标签装饰器,以便修改默认的渲染功能。

class App_Form_Decorator_Label extends Zend_Form_Decorator_Label
{

    public function render()
    {
        // Insert here the render function of Zend_form_Decorator_Label but without the id decorator.
    }
}