Domanda

Sto cercando di rimuovere i decoratori predefiniti su un elemento modulo nascosto. Per impostazione predefinita, l'elemento nascosto viene visualizzato in questo modo:

<dt>Hidden Element Label (if I had set one)</dt>
<dd><input type="hidden" name="foobar" value="1" id="foobar"></dd>

Non voglio che il mio elemento nascosto occupi spazio sulla mia pagina. Voglio rimuovere tutti i decoratori predefiniti, quindi tutto ciò che mi rimane è il tag di input.

<input type="hidden" name="foobar" value="1" id="foobar">

Come posso raggiungere questo obiettivo?

È stato utile?

Soluzione

Per i campi nascosti è necessario un solo decoratore - ViewHelper:

$field = new Zend_Form_Element_Hidden('id');
$field->setDecorators(array('ViewHelper'));

Questo renderà solo il campo di input, senza wrapper ed etichetta Dt-Dd.

Altri suggerimenti

Dal Zend Element Decorators documentazione:

  

I decoratori predefiniti non devono essere   Loaded

     

Per impostazione predefinita, i decoratori predefiniti sono   caricato durante l'inizializzazione dell'oggetto.   Puoi disabilitarlo passando il   Opzione 'disableLoadDefaultDecorators'   al costruttore:

$element = new Zend_Form_Element('foo', 
    array('disableLoadDefaultDecorators' => true)
);

Uso questo

$element->removeDecorator('DtDdWrapper');

per sbarazzarsi dei tag dt dd attorno a elementi specifici

// basato su sopra - una semplice funzione per aggiungere un elemento nascosto a $ this form

/**
 * Add Hidden Element
 * @param $field
 * @param value
 * @return nothing - adds hidden element
 * */
public function addHid($field, $value){     
    $hiddenIdField = new Zend_Form_Element_Hidden($field);
    $hiddenIdField->setValue($value)
          ->removeDecorator('label')
          ->removeDecorator('HtmlTag');     
    $this->addElement($hiddenIdField);
}

Quando hai molti input nascosti, la migliore risposta è la seguente:

$elements = $this->getElements();
foreach ($elements as $elem)
    if ($elem instanceof Zend_Form_Element_Hidden)
        $elem->removeDecorator('label')->removeDecorator('HtmlTag');

Come menzionato in altri post setDisableLoadDefaultDecorators(true) non funziona se sono già caricati ... MA clearDecorators() funziona!

Non sono riuscito a disabilitare il funzionamento di LoadLoadDefaultDecorators in modo corretto. Ecco una soluzione che mi è venuta in mente.

$hiddenIdField = new Zend_Form_Element_Hidden('id');
$hiddenIdField->setValue($portalId)
              ->removeDecorator('label')
              ->removeDecorator('HtmlTag'); 

In HTML, il campo nascosto appare senza tag aggiuntivi attorno ad esso.

...
<dt><label for="password" class="required">Password</label></dt>
<dd><input type="password" name="password" id="password" value="" /></dd>
<input type="hidden" name="id" value="1" id="id" />
...

ecco cosa takeme2web da http://www.phpfreaks.com/ forum / index.php? topic = 225.848,0 suggerisce

& -

$ yourhiddenzendformelement gt; setDecorators (array ( 'ViewHelper'));

Utilizzando solo un singolo " ViewHelper " decorator genererà markup non valido se stai ancora utilizzando il wrapper <dl>. Un altro approccio è delineato nella ZF-2718 . Ciò aggiunge i campi nascosti a una sottomaschera racchiusa in un <dd>.

Bene, 2012 e ancora lo stesso problema. Se rimuovi i decoratori, l'html non verrà convalidato. Se li lasci, gli elementi nascosti occupano spazio. In tutti i miei progetti ho un helper CSS .hidden, quindi lo applico a <dd> e deseleziono l'etichetta:

$element = new Zend_Form_Element_Hidden('foo', array('value' => 'bar'));
$element->removeDecorator('Label');
$element->getDecorator('HtmlTag')->setOption('class', 'hidden');

HTML valido (5), forme carine. Questo può anche andare in un decoratore personalizzato per i campi nascosti.

Modifica

Ecco come lo inserisco nel mio elemento del modulo:

class Exanto_Form_Element_Hidden extends Zend_Form_Element_Hidden
{
    public function render(Zend_View_Interface $view = null)
    {
        $this->removeDecorator('Label');
        $this->getDecorator('HtmlTag')->setOption('class', 'hidden');
        return parent::render($view);
    }
}

Usa questo:

    foreach ($this->getElements() as $element) {

        $decorator = $element->getDecorator('label');
        if (!$decorator) {
            continue;
        }
        $decorator->removeOption('tag');
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top