Question

J'essaie de supprimer les décorateurs par défaut d'un élément de formulaire masqué. Par défaut, l'élément masqué est affiché comme suit:

<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 la place sur ma page. Je veux supprimer tous les décorateurs par défaut afin que je ne reste plus que la balise input.

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

Comment puis-je y parvenir?

Était-ce utile?

La solution

Pour les champs cachés, un seul décorateur est nécessaire - ViewHelper:

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

Ceci rendra uniquement le champ de saisie, sans wrapper Dt-Dd et sans étiquette.

Autres conseils

Extrait du décorateurs Zend Element documentation:

  

Les décorateurs par défaut n'ont pas besoin d'être   Chargé

     

Par défaut, les décorateurs par défaut sont   chargé lors de l'initialisation de l'objet.   Vous pouvez le désactiver en passant le   Option 'disableLoadDefaultDecorators'   au constructeur:

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

je l'utilise

$element->removeDecorator('DtDdWrapper');

pour supprimer les balises dt dd autour d'éléments spécifiques

// basé sur ce qui précède - une fonction simple pour ajouter un élément masqué à $ ce formulaire

/**
 * 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 caché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 publications setDisableLoadDefaultDecorators(true) ne fonctionne pas s'ils sont déjà chargés ... MAIS clearDecorators() si!

Je ne pouvais pas faire en sorte que disableLoadDefaultDecorators fonctionne 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 code HTML, le champ masqué apparaît sans balises supplémentaires.

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

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

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

Utilisation d'un seul " ViewHelper " decorator générera un balisage non valide si vous utilisez toujours l'encapsuleur <dl>. Une autre approche est décrite dans la ZF-2718 . Cela ajoute des champs cachés à un sous-formulaire encapsulé dans un <dd>.

Eh bien, 2012 et toujours le même problème. Si vous supprimez les décorateurs, le code HTML ne sera pas validé. Si vous les quittez, les éléments cachés prennent de la place. Dans tous mes projets, j’ai un assistant CSS .hidden, je l’applique donc au <dd> et désactive l’étiquette:

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

Valid html (5), de jolis formulaires. Cela peut également aller dans un décorateur personnalisé pour les champs cachés.

MODIFIER

Voici comment je le mets 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);
    }
}

Utilisez ceci:

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

        $decorator = $element->getDecorator('label');
        if (!$decorator) {
            continue;
        }
        $decorator->removeOption('tag');
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top