在 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 的开发分支?

如何在Zend framework2中清除会话容器

如何在Zend Framework 2中访问路由,发布,获取等参数

在 Zend Framework 2 中使用 Zend_Mail + Zend_Mime 创建 HTML 电子邮件