如何删除Zend表单元素上的所有DtDdWrappers和标签 [英] How To Remove All DtDdWrappers and Labels on Zend Form Elements

查看:70
本文介绍了如何删除Zend表单元素上的所有DtDdWrappers和标签的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道我可以像这样分别从每个元素中删除多余的东西

I know I can remove the extra stuff from each element individually like so

$button ->removeDecorator('DtDdWrapper')
        ->removeDecorator('HtmlTag')
     ->removeDecorator('Label');

我想知道我是否可以通过zend形式实现所有元素的相同功能?
以及如何删除包裹表格的dl?

I was wondering if I can achieve the same for all my elements in a zend form?
And how does one remove the dl wrapping the form?

推荐答案

Markus,这是我使用的一种似乎效果很好的解决方案,希望它会适合您.

Markus, here is a solution that I use that seems to work well, hopefully it will be suitable for you.

首先,为了不使用<dl>标记呈现表单,我们需要在表单对象本身上设置装饰器.从扩展Zend_Form的类内部,您将调用Zend_Form->setDecorators()并传递一组表单装饰器.

First, in order to render the form with no <dl> tag, we need to set the decorators on form object itself. From inside a class extending Zend_Form, you would call Zend_Form->setDecorators() passing an array of form decorators.

根据参考指南:

The default decorators for Zend_Form are FormElements, HtmlTag (wraps in a definition list), and Form; the equivalent code for creating them is as follows:

  $form->setDecorators(array(
      'FormElements',
      array('HtmlTag', array('tag' => 'dl')),
      'Form'
  ));

要将表单包装成除dl之外的其他内容,我们使用上述装饰器,但将dl更改为您使用的任何标签,我通常使用类formdiv,我们将在后面看到.

To wrap the form in something other than a dl, we use the above decorators but change the dl to whatever tag you use, I typically use a div of class form which we will see later.

接下来,需要处理元素. Zend_Form元素对于不同类型的元素具有不同的装饰器.以下元素类型组各有一组不同的装饰器:[Submit&按钮],[验证码],[文件],[图像]和[收音机*].无线电的装饰器与标准元素非常相似,不同的是它没有在标签内指定for属性.

Next, the elements need to be dealt with. Zend_Form elements have different decorators for different types of elements. The following groups of element types each have their own distinct set of decorators: [Submit & Button], [Captcha], [File], [Image], and [Radio*]. The decorator for radio is very similar to standard elements except that it does not specify the for attribute inside the label.

所有其他表单元素,文本,密码,选择,复选框等使用相同的默认装饰器集.

All other form elements, text, password, select, checkbox, etc use the same set of default decorators.

要从单个表单元素中删除dd/dt标签,我们需要对其应用自己的一组装饰器.这是一个不使用dd/dt标签的示例:

To remove the dd/dt tags from an individual form element we would need to apply our own set of decorators to it. Here is an example that does not use dd/dt tags:

array(
    'ViewHelper',
    'Errors',
    array('Description', array('tag' => 'p', 'class' => 'description')),
    array('HtmlTag',     array('class' => 'form-div')),
    array('Label',       array('class' => 'form-label'))
);

这会将每个表单元素包装在带有form-div类的div标签中.问题是,您必须将这套装饰器应用于每个您不想包装在dd/dt标签中的元素,这可能会有些问题.

This will wrap each form element in a div tag with the class form-div. The problem is, you have to apply this set of decorators to EVERY element that you don't want to be wrapped in the dd/dt tags which can be a bit problematic.

为解决此问题,我创建了一个从Zend_Form扩展的类,并为其提供了一些默认行为和装饰器,这些行为和装饰器与Zend_Form的默认装饰器不同.

To solve this issue, I create a class that extends from Zend_Form and give it some default behavior and decorators that are different from the default decorators for Zend_Form.

虽然我们不能完全让Zend_Form自动将正确的装饰器分配给特定的元素类型(您可以将它们分配给特定的元素 names ),但我们可以设置默认值,并让自己轻松访问装饰器可以放在一个地方,因此,如果需要更改,可以很容易地将其更改为所有形式.

While we can't quite have Zend_Form automatically assign the correct decorators to specific element types (you can assign them to specific element names), we can set a default, and give ourselves easy access to the decorators from one place, so if they need to change, they can be easily changed for all forms.

这是基类:

<?php

class Application_Form_Base extends Zend_Form
{
    /** @var array Decorators to use for standard form elements */
    // these will be applied to our text, password, select, checkbox and radio elements by default
    public $elementDecorators = array(
        'ViewHelper',
        'Errors',
        array('Description', array('tag' => 'p', 'class' => 'description')),
        array('HtmlTag',     array('class' => 'form-div')),
        array('Label',       array('class' => 'form-label', 'requiredSuffix' => '*'))
    );

    /** @var array Decorators for File input elements */
    // these will be used for file elements
    public $fileDecorators = array(
        'File',
        'Errors',
        array('Description', array('tag' => 'p', 'class' => 'description')),
        array('HtmlTag',     array('class' => 'form-div')),
        array('Label',       array('class' => 'form-label', 'requiredSuffix' => '*'))
    );

    /** @var array Decorator to use for standard for elements except do not wrap in HtmlTag */
    // this array gets set up in the constructor 
    // this can be used if you do not want an element wrapped in a div tag at all
    public $elementDecoratorsNoTag = array();

    /** @var array Decorators for button and submit elements */
    // decorators that will be used for submit and button elements
    public $buttonDecorators = array(
        'ViewHelper',
        array('HtmlTag', array('tag' => 'div', 'class' => 'form-button'))
    );


    public function __construct()
    {
        // first set up the $elementDecoratorsNoTag decorator, this is a copy of our regular element decorators, but do not get wrapped in a div tag
        foreach($this->elementDecorators as $decorator) {
            if (is_array($decorator) && $decorator[0] == 'HtmlTag') {
                continue; // skip copying this value to the decorator
            }
            $this->elementDecoratorsNoTag[] = $decorator;
        }

        // set the decorator for the form itself, this wraps the <form> elements in a div tag instead of a dl tag 
        $this->setDecorators(array(
                             'FormElements',
                             array('HtmlTag', array('tag' => 'div', 'class' => 'form')),
                             'Form'));

        // set the default decorators to our element decorators, any elements added to the form
        // will use these decorators
        $this->setElementDecorators($this->elementDecorators);

        parent::__construct();
        // parent::__construct must be called last because it calls $form->init()
        // and anything after it is not executed
    }
}

/*
   Zend_Form_Element default decorators:
   $this->addDecorator('ViewHelper')
        ->addDecorator('Errors')
        ->addDecorator('Description', array('tag' => 'p', 'class' => 'description'))
        ->addDecorator('HtmlTag', array('tag' => 'dd',
                                        'id'  => array('callback' => $getId)))
        ->addDecorator('Label', array('tag' => 'dt'));
*/

现在要使用该类,请从该基类扩展所有表单,然后像往常一样分配元素.如果使用Zend_Form_Element_XXX而不是addElement(),则需要将其中一个装饰器作为选项传递给元素构造器,如果使用Zend_Form-> addElement,则它将使用我们分配的默认装饰器$elementDecorators在课堂上.

Now to use the class, extend all of your forms from this base class and go about assigning elements as usual. If you use Zend_Form_Element_XXX as opposed to addElement() then you will need to pass one of the decorators as an option to the element constructor, if you use Zend_Form->addElement, then it will use the default decorator $elementDecorators we assigned in the class.

以下是显示如何从该类扩展的示例:

Here is an example that shows how to extend from that class:

<?php

class Application_Form_Test extends Application_Form_Base
{
    public function init()
    {
        // Add a text element, this will automatically use Application_Form_Base->elementDecorators for its decorators
        $this->addElement('text', 'username', array(
            'label'      => 'User Name:',
            'required'   => false,
            'filters'    => array('StringTrim'),
        ));

        // This will not use the correct decorators unless we specify them directly
        $text2 = new Zend_Form_Element_Text(
            'text2',
            array(
                'decorators' => $this->elementDecorators, // must give the right decorator
                'label' => 'Text 2'
            )
        );

        $this->addElement($text2);

        // add another element, this also uses $elementDecorators
        $this->addElement('text', 'email', array(
            'label'      => 'Email:', 
            'required'   => false,
            'filters'    => array('StringTrim', 'StringToLower'), 
        ));

        // add a submit button, we don't want to use $elementDecorators, so pass the button decorators instead
        $this->addElement('submit', 'submit', array(
            'label' => 'Continue', 
            'decorators' => $this->buttonDecorators // specify the button decorators
        ));
    }
}

这显示了一种非常有效的方法来摆脱dd/dt和dl元素并将其替换为您自己的元素.必须为每个元素指定装饰器,这有点不方便,这与能够将装饰器分配给特定元素相反,但这似乎很好.

This shows a pretty effective way to get rid of the dd/dt and dl elements and replace them with your own. It is a bit inconvenient to have to specify the decorators for every element, as opposed to being able to assign decorators to specific elements, but this seems to work well.

要添加另一个我认为您想做的解决方案,如果您想渲染不带标签的元素,只需创建一个新的装饰器,并从中省略标签装饰器,就像这样:

To add one more solution that I think you were looking to do, if you would like to render an element with no label, simply create a new decorator and omit the label decorator from it like this:

$elementDecorators = array(
    'ViewHelper',
    'Errors',
    array('Description', array('tag' => 'p', 'class' => 'description')),
    array('HtmlTag',     array('class' => 'form-div')),
    // array('Label',       array('class' => 'form-label', 'requiredSuffix' => '*'))
    // comment out or remove the Label decorator from the element in question
    // you can do the same for any of the decorators if you don't want them rendered
);

随时要求澄清任何事情,希望对您有所帮助.

Feel free to ask for clarification on anything, hopefully this will help you out.

这篇关于如何删除Zend表单元素上的所有DtDdWrappers和标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆