Domanda

Ho 2 requisiti: 1) Tutti gli elementi di input nascosti dovrebbero essere influenzate senza rimuovere decoratori standard. 2) Ciò dovrebbe avvenire senza dover specificare su una base per-elemento.

Tutto quello che serve è per una classe CSS da allegare ai tag DT e DD se il tipo di elemento è Zend_Form_Element_Hidden.

Ho cercato di creare HtmlTag personalizzati, decoratori DtDdWrapper e FormElement, ma non sono stati in grado di capire come farlo.

Per impostazione predefinita vengono visualizzati in questo modo:

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

Vorrei che per apparire in questo modo:

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

In questo modo saranno ancora dove dovrebbero essere, ma essi non interrompere il flusso del documento.

Esempio di ciò che non ha funzionato:

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);
        }
    }
È stato utile?

Soluzione

, sulla base di un esempio di output desiderato Sono poco chiaro perché si vuole includere il <dt> su elementi nascosti, soprattutto dal momento che non sta applicando alcuna etichetta, finiscono per diventare markup inutile. Seguendo l'ipotesi che l'etichetta è necessario , è possibile ottenere l'effetto desiderato con il seguente:

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

Entrambi gli elementi di cui sopra darà luogo alla stessa uscita con i rispettivi id. Esempio:

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

Il foreach ciclo nel metodo loadDefaultDecorators() $this->_hiddenElementDecorator applica iterativamente per ciascun elemento di modulo nascosto quando il modulo viene costruito. Se si desidera applicare l'elemento decoratore nascosta su molteplici forme, basta creare una classe genitore con il metodo $_hiddenElementDecorator variabile e Zend_Form_Decorator_Label in esso.


Tuttavia, se avete il vostro cuore su comprendente l'elemento etichetta (if (null !== $tag)) come descritto nel vostro esempio di output e applicando la classe di 'nascosto' così si finisce con:

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

... è necessario estendere la classe TestForm e sovrascrivere il metodo render (). Date un'occhiata al il commento nel blocco <=>:

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

    }
}

Infine, per applicare la nuova decoratrice a tutti gli elementi del modulo nascosti è necessario aggiungere il punto di percorso un prefisso elemento al vostro decoratore e re-add il decoratore etichetta al <=> serie nella 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();
    }
}        

Facile come torta, no?

Altri suggerimenti

Questo vi aiuterà a: È inoltre possibile specificare altri attributi.

$el = $form->getElement('whatever');
$el->addDecorators(
            array('ViewHelper',
            array('HtmlTag',array('tag' => 'dt','class'=>'hidden')),
            array('Label', array('tag' => 'dd ',  'class'=>'hidden')),
            ));
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top