Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 25-03-2008 07:30:07

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

[Zend_Form] Utilisation des décorateurs

Bon, j'y arrive pas Bonjour,

Vous faites comment ?

1. Je ne peux pas donner d'id ou de classe au label (si je donne l'id pour changer le lable, celui ci est écris dans le "for=" si je donne la classe, celui ci est écrit "class=required".

2. Comment faire précéder le formulaire par <table> et voir mieux, générer la ligne d'entête <th> ?

3. Comment donner un style aux messages d'erreurs, voir change les puces ul

4. Dans ce code, ça veut dire quoi les "" ou null :

Code:

array(array('ViewHelper', array('tag' => "")),
                            array('Errors', array('tag' => "")),
                            array('Label', array('tag' => NULL, 'separator'=>'')),
                            array('HtmlTag', array('tag' => "div",'class'=>'element-group'))));

5. Dans ce code, d'ou sort 'decorators' (array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td')) et pourquoi il y'a deux 'decorators' ? On met quoi dans 'options'

Code:

//   $this->setElementDecorators(array(
//        'ViewHelper',
//        'Errors',
//        array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td')),
//        array('Label', array('tag' => 'td')),
//        array('decorator' => array('tr' => 'HtmlTag'), 'options' => array('tag' => 'tr')),
//    ));

Je croyais qu'il fallait mettre dans le premier argument une classe tel que (fieldset, label, ce qui se trouve dans le répertoire /library/form/decorators/

6. Si j'utilise le validator Date pour un champs Input, comment vérifier que ma date est bien au format jj/mm/aaaa ? (voici ma ligne

->addValidator('Date', true, array('messages' => 'La date doit être au format dd/mm/aaaa'));

Voilà, j'ai passé beaucoup de temps sur ces décorators ce week mais je n'ai pas réussi les manipuler comme je le souhaite.

Merci pour votre aide et patience. A bientot.

Dernière modification par whitespirit (25-03-2008 08:02:00)

Hors ligne

 

#2 25-03-2008 11:59:43

Nikkau
Membre
Date d'inscription: 25-03-2008
Messages: 52

Re: [Zend_Form] Utilisation des décorateurs

Yop,

Bonjour tout le monde, pour mon premier post ici j'vais essayer de répondre à ce que j'ai piger sur les décorators car je me prends la tête dessus aussi en ce moment.

J'vais répondre au 5 car c'est là dessus que je me suis documenté.

En fait, les décorators que tu ajoutes forment une liste qui est appliquée avec une boucle dans l'ordre où tu les as donner.
A chaque étape, on prend le HTML déjà écrit et on ajoute des trucs devant ou derrière.

Premier truc, le ViewHelper, il créé le html de base de ton élement:

Code:

<element>

Ensuite "Errors" ajoute les erreurs si y en a:

Code:

<element>
<ul class="errors">
   <li>Votre valeur est caca</li>
</ul>

3ème étape, HtmlTag emballe le tout avec un tag donné, ici td:

Code:

<td>
   <element>
   <ul class="errors">
      <li>Votre valeur est caca</li>
   </ul>
<td>

"Label" récupère le label, l'emballe avec un tag td et l'ajoute devant ce qu'on a déjà:

Code:

<td><label>Element</label></td>
<td>
   <element>
   <ul class="errors">
      <li>Votre valeur est caca</li>
   </ul>
<td>

Dernière étape, encore un HtmlTag, qui fait encore la même chose mais avec le tag tr cette fois.

Code:

<tr>
   <td><label>Element</label></td>
   <td>
      <element>
      <ul class="errors">
         <li>Votre valeur est caca</li>
      </ul>
   <td>
<tr>

Perso je trouve ça, super PAS intuitif, mais quand on a pigé ça reste quand même bien foutu.
Au final, transformé un formulaire existant en Zend_Form décoré n'est pas si méchant si le document de base est bien écrit, car finalement en suivant l'indentation des balises html on s'y retrouve assez bien.

Edit: car j'ai dis une connerie (même si sûrement personne a eu le temps de la lire.

"array('decorator' => array('td' => 'HtmlTag'), 'options' => array('tag' => 'td'))" est l'équivalent de "array('HtmlTag', array('tag' => 'td'))" avec une petite subtilité.

Avec cette formulation on définit un alias, c'est à dire que ce decorator aura "td" comme nom, alors qu'avec la deuxième syntaxe il serait appelé "HtmlTag".
Le but c'est de pouvoir avoir plusieurs decorators du même type mais avec des noms distincts, ça permet d'utiliser la méthode "removeDecorator($name)".


Edit2:
Pour le point 2, en se basant sur ce que je viens d'expliquer, il faut peut être utiliser le decorator ViewScript pour ajouter du contenu "fixe", avec l'option qui va bien pour le mettre en placement "prepend" pour l'ajouter au haut de ton formulaire.

Pour le point 3, sur les messages d'erreurs.
Dans la classe qui gère les erreurs on voit:
    protected $_htmlElementEnd       = '</li></ul>';
    protected $_htmlElementStart     = '<ul class="errors"%s><li>';
    protected $_htmlElementSeparator = '</li><li>';

Ainsi que les methodes:
    public function setElementEnd($string)
    public function setElementStart($string)
    public function setElementSeparator($string)

Je suppose qu'il faut chercher par là.
J'ai pas le temps de regarder mais je suppose qu'on peut sûrement les modifier avec des options quand on ajoute ce decorator à la liste.

Dernière modification par Nikkau (25-03-2008 12:53:47)

Hors ligne

 

#3 26-03-2008 05:59:03

whitespirit
Membre
Date d'inscription: 25-01-2008
Messages: 393

Re: [Zend_Form] Utilisation des décorateurs

ok, je vais faire des tests, et fouiller dans le code ZF, je verrais ça. smile merchiche

Hors ligne

 

#4 18-02-2009 14:47:06

ALkyD
Membre
Lieu: Limoges
Date d'inscription: 11-07-2007
Messages: 69
Site web

Re: [Zend_Form] Utilisation des décorateurs

Bonjour,
désolé de remonter un vieux sujet, j'ai également le même problème avec ces décorateurs.

Je veux mettre mon formulaire dans un tableau, j'ai suivi le tuto de devzone de Zend (http://devzone.zend.com/article/3450-De … -Zend_Form). Jusqu'ici, pas de problème en appliquant des décorateurs pour les éléments et pour le formulaire lui-même :

Code:

$element->setDecorators(array(
    'ViewHelper',
    'Errors',
    array(array('data' => 'HtmlTag'), array('tag' => 'td')),
    array('Label', array('tag' => 'td'),
    array(array('row' => 'HtmlTag'), array('tag' => 'tr')),
));
$form->setDecorators(array(
    'FormElements',
    array('HtmlTag', array('tag' => 'table')),
    'Form',
));

J'obtiens :

Code:

<form>
<table>
...
<tr>
   <td><label>Element</label></td>
   <td>
      [element]
      <ul class="errors">
         <li>Votre valeur est caca</li>
      </ul>
   <td>
<tr>
...
</table>
</form>

Le truc maintenant, c'est que j'aimerais bien rajouter une classe CSS aux deux colonnes 'td' de chaque ligne.

Si je rajoute une option class comme suivant :

Code:

$element->setDecorators(array(
    'ViewHelper',
    'Errors',
    array(array('data' => 'HtmlTag'), array('tag' => 'td', 'class' => 'element')),
    array('Label', array('tag' => 'td', 'class' => 'label'),
    array(array('row' => 'HtmlTag'), array('tag' => 'tr')),
));

J'ai bien un <td class="element"> (le 2ème td) mais pas un <td class="label"> car la classe va sur le label lui-même : <td><label class="label">...</label></td>...

Comment faire pour mettre cette classe sur le td ?

Merci

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages