在 Zend Framework 中,如何使用装饰器将表单元素包装在标签中?
Posted
技术标签:
【中文标题】在 Zend Framework 中,如何使用装饰器将表单元素包装在标签中?【英文标题】:In Zend Framework how do you wrap form elements in a label using decorators? 【发布时间】:2010-11-02 00:36:30 【问题描述】:我想用这样的标签包装表单元素
<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 类,但这是最后的选择。
【问题讨论】:
【参考方案1】:不幸的是,这似乎不可能,您可能必须编写自定义装饰器。不过应该很简单。
请注意我只是在这里写这个,它未经测试,但基于另一个装饰器,所以它应该很少/不需要修改
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。现在已修复。
【讨论】:
您忘记在“return”中呈现 $element 的标签文本【参考方案2】:我总是发现装饰器在任何给定情况下都被过度设计了,这有点违背了将表示层与业务逻辑分离的目的。您可以使用 Zend 的部分帮助程序或使用 Zend_Form 或两者的组合创建自己的小部件,这将使您对演示文稿有更多的控制。
在一些 Xhtml 参考站点上,它们不会将输入元素列为标签的有效子元素,尽管文本和任何内联元素都应该是有效的。这可能是不允许这样做的另一个原因。
【讨论】:
【参考方案3】:我猜你不应该使用它;)这是因为标签的内容是字段的描述。将元素包含在描述中是无稽之谈。如果需要,您可以将两者都包装成 div 或类似的东西。
唯一的原因是 CSS 写得不好 :)
【讨论】:
【参考方案4】:我假设您希望标签在元素旁边对齐。
例子
$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 元素
【讨论】:
以上是关于在 Zend Framework 中,如何使用装饰器将表单元素包装在标签中?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用Zend Framework 2使用Rest API
如何在 Zend Framework 2 中为局部使用共享视图脚本路径?
如何在 composer 上使用 Zend Framework 2 的开发分支?