我想用标签包装表单元素
<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类,但这是最后一种选择。
答案 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元素