Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Je sollicite vos lumières au sujet d'un soucis.
J'ai créé mon formulaire via Zend form. Ainsi toutes les entités sont encapsulés dans des DD et DT.
Ce que je voudrais faire, c'est mettre des classes à certains DT (qui contient les labels). Pourquoi, parce que lorsqu'ils sont vides, je veux pouvoir leurs attribuer des propriétés CSS particulières (les faire disparaitre !), je ne veux pas les supprimer car je veux garder un code correcte.
En essayant de faire setClass à un décorator label, tout ce que j'ai pu faire, c'est mettre la classe au label, et non pas au DT qui l'englobe.
Que faire ?
Dois je me créer un décorator personalisé ? Auriez vous des codes sources montrant précisément la création d'un décorator, parce que dans la doc de ZF. je n'ai pas compris.
D'une facon générale je trouve interressant de pouvoir mettre des attributs aux DD et DT, pour garder un controle optimal du rendu.
Merci d'avance !
Hors ligne
C'est le décorateur HtmlTag qu'il faut 'diriger', pas le decorateur des labels.
Par exemple
array('HtmlTag', array('tag' => 'div', 'class' => 'ctrlHolder'))
Ca va encapsuler avec des div et mettre un class='ctrlHolder' à ton div.
Attention biensur à l'ordre de tes decorateurs
Exemple de décoration d'un élément :
'ViewHelper', array('Description', array('class' => 'formHint')), array('Label', array('requiredPrefix' => '<em>*</em>', 'escape' => false)), array('Errors', array('placement' => 'prepend')), array('HtmlTag', array('tag' => 'div', 'class' => 'ctrlHolder'))
Mon HtmlTag est en dernier, ca donne ca :
<div class="ctrlHolder"> <label for="src" class="required"><em>*</em>Type d'entrée:</label> <select name="src" id="src"> <option value="xlsx" label="Fichier Excel 2007 (.xlsx)">Fichier Excel 2007 (.xlsx)</option> <option value="csv" label="Fichier Csv">Fichier Csv</option> <option value="form" label="Par formulaire web">Par formulaire web</option> </select> </div>
Hors ligne
Ah, je ne connaissais pas. Mais dans l'idée sur ta solution on englobe toutes les entités, en l'ocurrence ton input et son label, dans un seul decorator.
Moi je voudrais :
<dt class="invisible"></dt> <dd> <select name="src" id="src"> <option value="xlsx" label="Fichier Excel 2007 (.xlsx)">Fichier Excel 2007 (.xlsx)</option> <option value="csv" label="Fichier Csv">Fichier Csv</option> <option value="form" label="Par formulaire web">Par formulaire web</option> </select> </dd>
dans mon cas présent c'est ce que je veux faire. Après si il m'est possible de completement fixer des attribus pour chaque HTMLTAG c'est encore mieux.
Hors ligne
Alors, il faut pt etre créé ton décorateur (quand on cherche trop longtemps, c'est pt etre le plus simple)
Perso, j'ai du refaire un décorateur Errors, car je voulais
1/ rajouté des attribut a mon HtmlTag qui englobe mes labels dans le cas ou il y avait une erreur.
2/ Changer les balises qu'il utilise (je ne voulais pas de ul li) (pt etre qu'avec le 1.6, on a plus besoin de ca et que des attibuts son dispo maintenant)
mon 1/ semble similaire avec ce que tu veux.
class My_Form_Decorator_Errors extends Zend_Form_Decorator_Errors { public function render($content) { $element = $this->getElement(); $view = $element->getView(); if (null === $view) { return $content; } $errors = $element->getMessages(); if (empty($errors)) { return $content; } $element->getDecorator('Htmltag')->setOption('class', 'ctrlHolder error'); $formErrors_Helper = $view->getHelper('formErrors'); $formErrors_Helper->setElementStart('<p class="errorField"><strong>'); $formErrors_Helper->setElementSeparator('</strong></p><p class="errorField"><strong>'); $formErrors_Helper->setElementEnd('</strong></p>'); return (parent::render($content)); } }
Tu peux utiliser le même principe :
- Tu refais ton décorateur label
- Celui-ci hérite de celui d'origne. (comme j'ai fait pour errors)
- En plus, tu rajoutes le code qui teste si ton label est vide ou pas (getElement->getValue())
- Si il est vide, tu récupéres le décorateur HtmlTag et tu lui rajoutes l'attrib class invisible (un peu comme j'ai fait)
Même si ce que je dis n'est pas correct, ca doit tourné autour de ca.
Bon courage
Dernière modification par nORKy (12-09-2008 10:51:35)
Hors ligne
Salut, je fais remonter ce post car j'ai trouvé une solution simple qui pourrait servir !!
Donc, pour contrôler la balise HTML entourant le label, j'ai fais ceci :
Au lieu d'avoir
array('Label', array('tag' => 'td')),
j'ai mis
array('Label'), array(array('' => 'HtmlTag'), array('tag' => 'td', 'style' => 'width:120px;')),
ce qui a pour résultat le controle de la balise comme dit plus haut.
Mais j'ai fais ça au hasard, donc je serais partant pour une explication ^^
Hors ligne
D'après le code de la fonction addDecorator
array(array('' => 'HtmlTag'), array('tag' => 'td', 'style' => 'width:120px;')),
est pareil que
array( 'HtmlTag', array('tag' => 'td', 'style' => 'width:120px;')),
Hors ligne
Pages: 1