Zend Framework: come posso rimuovere i decoratori su un elemento nascosto Zend Form?
-
20-08-2019 - |
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?
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');
}