【问题标题】:In Zend Framework how do you wrap form elements in a label using decorators?在 Zend Framework 中,如何使用装饰器将表单元素包装在标签中?
【发布时间】: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 类,但这是最后的选择。

【问题讨论】:

    标签: php zend-framework forms decorator


    【解决方案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 元素

        【讨论】:

          猜你喜欢
          • 2012-10-23
          • 2012-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多