web-dev-qa-db-fra.com

Zend Framework: Comment supprimer les décorateurs d'un élément caché du formulaire Zend?

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?

49
Andrew

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.

50
ischenkodv

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)
);
32
drfloob

J'utilise ceci

$element->removeDecorator('DtDdWrapper');

se débarrasser des balises dt dd autour d'éléments spécifiques

24
dittonamed

// 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);
}
6
Joseph

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');
5
yanek1988

Comme mentionné dans d'autres articles setDisableLoadDefaultDecorators(true) ne fonctionne pas s'ils sont déjà chargés ... MAIS clearDecorators() le fait!

4
Grant Perry

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" />
...
3
Andrew

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);
    }
}
2
Novalis

voici ce que takeme2web de http://www.phpfreaks.com/forums/index.php?topic=225848. suggère

$ yourhiddenzendformelement-> setDecorators (array ('ViewHelper'));

2
Svetoslav Marinov

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>.

2
Tim Brayshaw

Utilisez ceci:

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

        $decorator = $element->getDecorator('label');
        if (!$decorator) {
            continue;
        }
        $decorator->removeOption('tag');
    }
0
MD66