IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Form PHP Discussion :

Décorateur : ajouter une classe spécifiée par l'element


Sujet :

Zend_Form PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Par défaut Décorateur : ajouter une classe spécifiée par l'element
    Bonjour

    Je voudrais savoir s'il est possible avec les décorateur standards de faire ajouter une classe qui serait spécifiée par l'element qui appelle le décorateur.

    Je m'explique, dans un formulaire j'ai plusieurs displaygroup, pour chaque display groupe je veux afficher un picto (identité,adresse, mail,...) à coté du titre du display group. Pour cela j'utilise une class différente pour chacun (un ID m'irait aussi - je ne ferais pas la difficile). Je souhaiterai que cette classe (ou l'ID) soit ajoutée par le décorateur.

    Voici le code HTML que je souhaite obtenir (en rouge ce que je souhaite être variable)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <div class="bloc blocident">
       <h3>Identité</h3>
       <div class="ctrlHolder">
           <label for="nom" class="required">Nom :</label>
           <input type="text" name="nom" id="nom" value="" />
       </div>
       <div class="ctrlHolder">
          <label for="prenom" class="required">Prénom :</label>
          <input type="text" name="prenom" id="prenom" value="" />
       </div>
    </div>


    Pour ne pas avoir a ré-ecrire le décorateur a chaque fois j'ai une class spéciale de qui etend la class zend_form et tous mes formulaires l'etendent.
    J'ai ai déclaré un décorateur par defaut pour les displaygroup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    protected $_standardGroupDecorator = array(
     
    			array('Description', 'options' => array('tag' => 'h3')),
    			'FormElements',			
    			array('HtmlTag', 'options' => array('tag' => 'div', 'class' => 'bloc')),
     
    	);

    Dans mon formule, je déclare le displaygroup :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    	$this->addDisplayGroup(array('nom', 'prenom'),'identite', array(
            'disableLoadDefaultDecorators' => true,
            'decorators' => $this->_standardGroupDecorator,
    	'description' => "Identité",
    	'class' => "blocident"
        	));

    J'obtiens le code attendu sauf que je n'ai pas la class blocident qui est spécifiée dans la création de mon displaygroup (et qui biensur sera différente pour les autres displaygroup de mon formulaire).

    Est ce que je suis obligée d'ecrire mon propre décorateur ou est ce que je peux parvenir a adresser cette class depuis le décorateur général.
    Evidement si je spécifiais le décorateur directement lors de la création du displaygroup ca sera faisable mais ca ne me convient pas, je veux que les élements de mise en page soient centralisés pour que je puisse les modifier et être sur qu'ils soient partout identiques.

    Merci d'avance

  2. #2
    Membre Expert
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Par défaut
    Bonjour,
    As tu essayé de la façon suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array(array('data' => 'HtmlTag'), array('tag' => 'div', 'class' => 'bloc'))
    à la place de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    array('HtmlTag', 'options' => array('tag' => 'div', 'class' => 'bloc')),

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Par défaut
    heu ???

    Ca fait exactement la même chose.

    Quelle est la différence entre les deux écritures ?

    Le système de décorateurs a l'air très sioux mais pas facile a maitriser.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Par défaut
    Bon finalement, j'ai créé une class décorateur qui étend la class de décorateur FieldSet et j'ai ré-ecrit juste le render.

    Ca fait exactement ce que je veux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    <?php
    class My_Form_Decorator_Bloc extends Zend_Form_Decorator_Fieldset
    {
     
     
     
     
    	public function buildDescription()
    	{
    		$element = $this->getElement();
    		$desc    = $element->getDescription();
    		if (empty($desc)) {
    			return '';
    		}
    		return '<h3>' . $desc . '</h3>';
    	}
     
     
       	public function render($content)
       	{
       		$element = $this->getElement();
       		$view    = $element->getView();
       		if (null === $view) {
       			return $content;
       		}
     
       		$legend  = $this->getLegend();
       		$attribs = $this->getOptions();
       		$name    = $element->getFullyQualifiedName();
       		$id      = (string)$element->getId();
       		$desc      = $this->buildDescription();
     
       		if (!array_key_exists('id', $attribs) && '' !== $id) {
       			$attribs['id'] = 'fieldset-' . $id;
       		}
     
       		if (null !== $legend) {
       			if (null !== ($translator = $element->getTranslator())) {
       				$legend = $translator->translate($legend);
       			}
     
       			$attribs['legend'] = $legend;
       		}
     
     
     
       		foreach (array_keys($attribs) as $attrib) {
       			$testAttrib = strtolower($attrib);
       			if (in_array($testAttrib, $this->stripAttribs)) {
       				unset($attribs[$attrib]);
       			}
       		}
       		$class = $id.' bloc ';
       		if (isset($attribs['class'])) { $class.=$attribs['class']; }
       		$output = '<div   class="'.$class.' " id='.$id.' >'.$desc;
     
       		return $output  . $content.'</div>';
     
       	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    protected $_standardGroupDecorator = array('FormElements',array('Bloc', array('class' => 'inlineLabels')));


    A coté de ca j'utilise une super class pour les formulaires qui permet de définir les décorateurs par défaut pour créer des beaux formulaires comme ceux ci .
    Cette classe est dispo ici . Voir les commentaires pour l'ajout de la gestion du displaygroup.


    Du coup les formulaires que je créé ne comportent aucun appel de décorateur, cela permet de garantir une parfaite harmonie dans toute l'application.

  5. #5
    Membre Expert
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Par défaut
    Citation Envoyé par boubil Voir le message
    heu ???

    Ca fait exactement la même chose.

    Quelle est la différence entre les deux écritures ?

    Le système de décorateurs a l'air très sioux mais pas facile a maitriser.
    C'est la documentation qui indique le formatage ainsi.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/10/2007, 13h33
  2. Taille d'une Classe limitée par builder ou la RAM?
    Par James_ dans le forum C++Builder
    Réponses: 3
    Dernier message: 18/10/2007, 11h48
  3. ajouter une classe dans un projet
    Par bonbino dans le forum C++Builder
    Réponses: 4
    Dernier message: 23/10/2006, 14h35
  4. ajouter une nouvelle colonne par un SELECT
    Par maysa dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/09/2006, 13h14
  5. Ajouter une class CSS a une nouvelle cellule
    Par Arfigado dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/09/2006, 10h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo