Frage

Ich habe 2 Anforderungen: 1) Alle versteckten Eingabeelemente sollten, ohne entfernen Standard Dekorateure beeinflusst werden. 2) Das sollte geschehen, ohne sie auf einer Pro-Element-Basis angegeben werden.

Alles was ich brauche ist für eine CSS-Klasse an die DT & DD-Tags angebracht werden, wenn der Elementtyp ist Zend_Form_Element_Hidden.

Ich habe versucht, benutzerdefinierte HtmlTag Erstellen DtDdWrapper und FormElement Dekorateure, aber nicht in der Lage, herauszufinden, wie es zu tun.

In der Standardeinstellung erscheinen sie auf diese Weise:

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

Ich möchte sie auf diese Weise erscheinen:

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

Auf diese Weise werden sie immer noch sein, wo sie sein sollten, aber sie werden den Fluss des Dokuments nicht unterbrechen.

Beispiel von dem, was nicht funktioniert hat:

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);
        }
    }
War es hilfreich?

Lösung

auf die gewünschte Beispielausgabe Basierend Ich bin unklar, warum Sie die <dt> auf versteckte Elemente umfassen würde wollen, vor allem, da Sie kein Etikett anwenden, sie am Ende immer unnötige Markup. Nach der Annahme, dass das Label ist nicht erforderlich können Sie den gewünschten Effekt mit dem folgenden erreicht werden:

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();
    }
}

Die beiden oben genannten Elemente werden in der gleichen Ausgabe mit ihren jeweiligen IDs führen. Beispiel:

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

Die foreach Schleife im loadDefaultDecorators() Verfahren wendet iterativ $this->_hiddenElementDecorator jedes Element verborgen Form, wenn die Form aufgebaut ist. Wenn Sie das versteckte Element Dekorateur auf mehrere Formen anwenden möchten, erstellen Sie einfach eine übergeordnete Klasse mit dem $_hiddenElementDecorator Variable und loadDefaultDecorators() Methode.


Wenn Sie jedoch Ihr Herz auf, einschließlich dem Label-Elements festgelegt haben (<dt>), wie in der Beispielausgabe und Anwendung die ‚versteckte‘ Klasse beschrieben, so dass Sie am Ende mit:

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

... müssen Sie die Zend_Form_Decorator_Label Klasse erweitern und außer Kraft setzen, die render () Methode. Werfen Sie einen Blick auf den Kommentar im if (null !== $tag) Block:

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;
        }

    }
}

Schließlich Ihren neuen Dekorateur all versteckten Formularelemente anwenden, müssen Sie das ein Element Präfixpfad Punkt zu Ihrem Dekorateur und re-add der Labeldekorator zum $_hiddenElementDecorator Array hinzuzufügen in die TestForm Klasse:

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();
    }
}        

Einfach als Torte, nicht wahr?

Andere Tipps

Dies wird Ihnen helfen: Sie können auch alle anderen Attribute angeben.

$el = $form->getElement('whatever');
$el->addDecorators(
            array('ViewHelper',
            array('HtmlTag',array('tag' => 'dt','class'=>'hidden')),
            array('Label', array('tag' => 'dd ',  'class'=>'hidden')),
            ));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top