J'essaie de supprimer les décorateurs par défaut sur un élément de formulaire caché. Par défaut, l'élément caché est affiché comme ceci:
<dt>Hidden Element Label (if I had set one)</dt>
<dd><input type="hidden" name="foobar" value="1" id="foobar"></dd>
Je ne veux pas que mon élément caché occupe de l'espace sur ma page. Je veux supprimer tous les décorateurs par défaut, il ne me reste donc que la balise d'entrée.
<input type="hidden" name="foobar" value="1" id="foobar">
Comment puis-je atteindre cet objectif?
Pour les champs cachés, vous n'avez besoin que d'un seul décorateur - ViewHelper:
$field = new Zend_Form_Element_Hidden('id');
$field->setDecorators(array('ViewHelper'));
Cela rendra uniquement le champ de saisie, sans wrapper Dt-Dd et étiquette.
Depuis la documentation Zend Element Decorators :
Les décorateurs par défaut n'ont pas besoin d'être chargés
Par défaut, les décorateurs par défaut sont chargés lors de l'initialisation de l'objet. Vous pouvez désactiver cela en passant l'option 'disableLoadDefaultDecorators' au constructeur:
$element = new Zend_Form_Element('foo', array('disableLoadDefaultDecorators' => true) );
J'utilise ceci
$element->removeDecorator('DtDdWrapper');
se débarrasser des balises dt dd autour d'éléments spécifiques
// basé sur ci-dessus - une fonction simple pour ajouter un élément caché à $ 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);
}
Lorsque vous avez beaucoup d'entrées masquées, la meilleure réponse est la suivante:
$elements = $this->getElements();
foreach ($elements as $elem)
if ($elem instanceof Zend_Form_Element_Hidden)
$elem->removeDecorator('label')->removeDecorator('HtmlTag');
Comme mentionné dans d'autres articles setDisableLoadDefaultDecorators(true)
ne fonctionne pas s'ils sont déjà chargés ... MAIS clearDecorators()
le fait!
Je n'ai pas réussi à faire fonctionner disableLoadDefaultDecorators correctement. Voici une solution que j'ai trouvée.
$hiddenIdField = new Zend_Form_Element_Hidden('id');
$hiddenIdField->setValue($portalId)
->removeDecorator('label')
->removeDecorator('HtmlTag');
Dans le HTML, le champ masqué apparaît sans balises supplémentaires autour de lui.
...
<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" />
...
Eh bien, 2012 et toujours le même problème. Si vous supprimez les décorateurs, le HTML ne sera pas validé. Si vous les laissez, les éléments cachés prennent de la place. Dans tous mes projets, j'ai un assistant CSS caché, donc je l'applique simplement au <dd>
et désélectionnez l'étiquette:
$element = new Zend_Form_Element_Hidden('foo', array('value' => 'bar'));
$element->removeDecorator('Label');
$element->getDecorator('HtmlTag')->setOption('class', 'hidden');
HTML valide (5), formes agréables à regarder. Cela peut également aller dans un décorateur personnalisé pour les champs cachés.
MODIFIER
Voici comment je l'ai mis dans mon propre élément de formulaire:
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);
}
}
voici ce que takeme2web de http://www.phpfreaks.com/forums/index.php?topic=225848. suggère
$ yourhiddenzendformelement-> setDecorators (array ('ViewHelper'));
L'utilisation d'un seul décorateur "ViewHelper" générera un balisage non valide si vous utilisez toujours le <dl>
wrapper. Une autre approche est décrite dans ZF-2718 . Cela ajoute des champs masqués à un sous-formulaire enveloppé dans un <dd>
.
Utilisez ceci:
foreach ($this->getElements() as $element) {
$decorator = $element->getDecorator('label');
if (!$decorator) {
continue;
}
$decorator->removeOption('tag');
}