Question

J'ai 2 exigences: 1) Tous les éléments d'entrée cachés doivent être affectés sans enlever les décorateurs standards. 2) Cela devrait se faire sans devoir préciser sur une base par élément.

Tout ce que je besoin est pour une classe CSS à joindre aux étiquettes DT & DD si le type d'élément est Zend_Form_Element_Hidden.

Je l'ai essayé de créer HtmlTag personnalisé, décorateurs DtDdWrapper et formElement, mais n'ont pas été en mesure de comprendre comment le faire.

Par défaut, ils apparaissent de cette façon:

<dt>&nbsp;</dt>
<dd><input type="hidden" name="whatever" value="bling" /></dd>

Je les voir apparaître cette façon:

<dt class="hidden">&nbsp;</dt>
<dd class="hidden"><input type="hidden" name="whatever" value="bling" /></dd>

De cette façon, ils vont toujours être là où ils devraient être, mais ils ne seront pas interrompre le flux du document.

Exemple de ce qui ne fonctionne pas:

class My_Form_Decorator_DtDdWrapper extends Zend_Form_Decorator_DtDdWrapper
{
    public function render($content)
    {
        if ($this->getElement() instanceof Zend_Form_Element_Hidden)
        {
            return '<dt class="hidden">&nbsp;</dt><dd class="hidden">'.$content.'</dd>';
        }
        else
        {
            return parent::render($content);
        }
    }
Était-ce utile?

La solution

En fonction de votre sortie désirée exemple, je suis pas clair pourquoi vous voulez inclure les éléments cachés sur <dt>, d'autant plus que vous n'êtes pas d'appliquer une étiquette, ils finissent par devenir inutile balisage. À la suite de l'hypothèse que l'étiquette est inutile , vous pouvez obtenir l'effet désiré avec les éléments suivants:

class TestForm extends Zend_Form
{
    protected $_hiddenElementDecorator = array(
        'ViewHelper',
        array('HtmlTag', array('tag' => 'dd', 'class' => 'hidden')),
    );

    public function init()
    {
        $this->addElement('hidden', 'hiddenElement0');

        $element = new Zend_Form_Element_Hidden('hiddenElement1');
        $this->addElement($element);

    }

    public function loadDefaultDecorators()
    {
        foreach ($this->getElements() as $element) {
            if ($element->getType() === "Zend_Form_Element_Hidden") {
                $element->setDecorators($this->_hiddenElementDecorator);
            }
        }

        parent::loadDefaultDecorators();
    }
}

Les deux éléments ci-dessus entraînera la même sortie avec leur carte d'identité respectives de. Exemple:

<dd class="hidden">
    <input type="hidden" name="hiddenElement0" value="" id="hiddenElement0" />
</dd>

La boucle foreach dans le procédé loadDefaultDecorators() $this->_hiddenElementDecorator applique de manière itérative à chaque élément de forme cachée lorsque le formulaire est construit. Si vous souhaitez appliquer le décorateur élément caché sur plusieurs formes, il suffit de créer une classe parente avec la méthode variable et $_hiddenElementDecorator en elle Zend_Form_Decorator_Label.


Cependant, si vous avez votre coeur sur l'élément dont l'étiquette (if (null !== $tag)) tel que décrit dans la sortie de l'échantillon et l'application de la classe « cachée » si vous vous retrouvez avec:

<dt class="hidden">&nbsp;</dt>
<dd class="hidden">
    <input type="hidden" name="hiddenElement0" value="" id="hiddenElement0" />
</dd>

... vous devez étendre la classe et remplacer la TestForm méthode render (). Jetez un oeil à ce commentaire dans le bloc <=>:

class My_Form_Decorator_Label extends Zend_Form_Decorator_Label
{
    public function render($content)
    {
        $element = $this->getElement();
        $view    = $element->getView();
        if (null === $view) {
            return $content;
        }

        $label     = $this->getLabel();
        $separator = $this->getSeparator();
        $placement = $this->getPlacement();
        $tag       = $this->getTag();
        $id        = $this->getId();
        $class     = $this->getClass();
        $options   = $this->getOptions();

        if (empty($label) && empty($tag)) {
            return $content;
        }

        if (!empty($label)) {
            $options['class'] = $class;
            $label = $view->formLabel($element->getFullyQualifiedName(), trim($label), $options);
        } else {
            $label = '&nbsp;';
        }

        if (null !== $tag) {
            require_once 'Zend/Form/Decorator/HtmlTag.php';
            $decorator = new Zend_Form_Decorator_HtmlTag();
            // Add 'class' => 'hidden' to the <dt> tag decorator options.
            $decorator->setOptions(array('tag' => $tag, 'class' => 'hidden'));
            $label = $decorator->render($label);
        }

        switch ($placement) {
            case self::APPEND:
                return $content . $separator . $label;
            case self::PREPEND:
                return $label . $separator . $content;
        }

    }
}

Enfin, pour appliquer votre nouveau décorateur à tous les éléments de formulaire cachés, vous devrez ajouter le point de chemin de préfixe élément à votre décorateur et rajoutez le décorateur de l'étiquette à la <=> tableau dans la classe <=>:

class TestForm extends Zend_Form
{
    protected $_hiddenElementDecorator = array(
        'ViewHelper',
        array('HtmlTag', array('tag' => 'dd', 'class' => 'hidden')),
        // Add back the label element.
        array('Label', array('tag' => 'dt', 'class' => 'hidden')),
    );

    public function init()
    {
        $this->addElement('hidden', 'hiddenElement0');

        $element = new Zend_Form_Element_Hidden('hiddenElement1');
        $this->addElement($element);

    }

    public function loadDefaultDecorators()
    {
        foreach ($this->getElements() as $element) {
            if ($element->getType() === "Zend_Form_Element_Hidden") {
                $element->setDecorators($this->_hiddenElementDecorator);
            }
        }

        // Add a decorator prefix path pointing to our new nifty decorator.
        $this->addElementPrefixPath('My_Form_Decorator', '/path/to/Decorator', Zend_Form_Element::DECORATOR);
        parent::loadDefaultDecorators();
    }
}        

Simple comme bonjour, non?

Autres conseils

Cela vous aidera à: Vous pouvez également spécifier d'autres attributs.

$el = $form->getElement('whatever');
$el->addDecorators(
            array('ViewHelper',
            array('HtmlTag',array('tag' => 'dt','class'=>'hidden')),
            array('Label', array('tag' => 'dd ',  'class'=>'hidden')),
            ));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top