在Zend Framework中,如何使用装饰器将表单元素包装在标签中?

时间:2009-06-11 03:30:52

标签: php zend-framework forms decorator

我想用标签包装表单元素

<label for="email">E-mail <input type="text" name="email" id="email" /></label>

我能找到的唯一选择是改变位置;但它只接受'prepend'和'append':

<!-- prepend -->
<label for="email">E-mail</label> <input type="text" name="email" id="email" />
<!-- append -->
<input type="text" name="email" id="email" /> <label for="email">E-mail</label>

这不是我所追求的。我可以改变Zend_Form_Decorator_Label类,但这是最后一种选择。

4 个答案:

答案 0 :(得分:5)

不幸的是,这似乎不可能,你可能不得不写一个自定义装饰器。不过应该很简单。

请注意我刚刚在这里写这个,它是未经测试但是基于另一个装饰器所以它应该很少/没有修改

class Your_Form_Decorator_Date extends Zend_Form_Decorator_Abstract {
    public function render($content) {
       $element = $this->getElement();

       $name = $element->getFullyQualifiedName();
       return '<label for="'.$name.'">'. $element->getLabel() . ' '.$content.'</label>';

    }
}

现在,如果您在表单中添加正确的前缀。

$this->addPrefixPath('Your_Form', 'Your/Form/');

您应该可以使用它将输入(FormElement装饰器)包装在标签标签中。

抱歉,我没有机会实际测试这个,但考虑到我的其他装饰工作原理。应该没问题。

编辑:感谢您指出标签文本没有呈现为gnarf。现在已经修复了。

答案 1 :(得分:0)

我总是发现装饰器对于任何给定的情况都是过度设计的,它有点破坏了将表示层与业务逻辑分离的目的。您可以使用Zend的部分帮助程序或使用Zend_Form或两者的组合创建自己的小部件,这样可以更好地控制演示文稿。

在某些XHTML参考站点上,虽然文本和任何内联元素都应该有效,但它们不会将输入元素列为标签的有效子元素。这可能是不被允许的另一个原因。

答案 2 :(得分:0)

我猜你不应该使用它;)这是因为标签的内容是该字段的描述。将元素包含在描述中是无稽之谈。如果你需要,你可以将它们包装成div或类似的东西。

唯一的原因是写得很糟糕的CSS:)

答案 3 :(得分:0)

我假设您希望标签在元素旁边排成一行。

实施例

$email = new Zend_Form_Element_Text('email');
$email->setLabel('Email: ');
$form = new Zend_Form();
$form->addElement($email);

现在,这将呈现表格

<label>Email:</label>
      <input type="text"/>

为了让文本框位于标签旁边,您需要单独渲染“标签”装饰器。要做到这一点:

我在控制器中创建了一个表单,将其分配给视图中的变量:

//in controller
$this->view->form = $form;

//in view script
$form = $this->form;

//('tag', null) tells the renderer not to wrap the label in the usual <dt> tag,  
//but not to use anything at all
$form->getElement('email')->getDecorator('label')->setOption('tag', null);

然后在你的视图脚本中......

<?php print($form->email) ?>

这将在自己的标签

旁边呈现Text元素