Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 22/11/2010, 15h15   #1
Candidat au titre de Membre du Club
 
Inscription : septembre 2009
Messages : 44
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 44
Points : 13
Points : 13
Par défaut [sfForm] [sfWidget] [sfWidgetFormDateJQueryUI] formattage des champs présentant une date

Bonjour tout le monde,

Voila j'ai un problème avec l'affichage des dates. J'utilise le plugin sfWidgetFormDateJQueryUI et il me fait tout ce que je lui demande sauf lorsqu'il récupère une date en base.
En base les dates sont stockées yyyy-mm-dd, et tout les champs qui affiche une date me l'affiche sous cette forme...
Je ne sais pas trop comment je peux faire pour contourner ce problème...

Merci
bedomon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 16h30   #2
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Il la récupère comment, la date en base ?
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 16h55   #3
Candidat au titre de Membre du Club
 
Inscription : septembre 2009
Messages : 44
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 44
Points : 13
Points : 13
hé bien la date est récupéree par un find($id) qui me retourne une doctrine collection qui alimente mon formulaire.
bedomon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/11/2010, 18h27   #4
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Un Doctrine_Collection pour alimenter un form ? Ce ne serait pas plutôt un Doctrine_Record, où encore mieux un sfRecord ?

Nonobstant, il provient de la base, et pas d'une alimentation différente.

Quel est le type de champ de la base ? Peux-tu mettre la partie du shema.yml qui concerne la table en question ?
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 16h15   #5
Membre habitué
 
Homme Jean-François
Développeur Web
Inscription : février 2003
Messages : 124
Détails du profil
Informations personnelles :
Nom : Homme Jean-François
Âge : 32
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : février 2003
Messages : 124
Points : 142
Points : 142
Avec l'admin generator tu peux faire ainsi :

fields:
champdate: {label: 'date', date_format: dd/mm/MM}

Dans formFilter :

Code :
1
2
3
4
5
6
7
8
9
10
11
 
<?php
$dateWidget = new sfWidgetFormI18nDate(array(
                    'format' => '%day%/%month%/%year%',
                    'month_format' => 'short_name',
                    'culture' => 'fr'));
$options = array(
            'image' => '/images/calendar.png',
            'culture' => 'fr',
            'date_widget' => $dateWidget);
$this->widgetSchema['datedebut'] = new sfWidgetFormFilterDate(array('from_date' => new sfWidgetFormJqueryDate($options), 'to_date' => new sfWidgetFormJqueryDate($options), 'with_empty' => false));
Dans un templates

Code :
1
2
3
4
5
<?php
use_helper('Date');
$format = 'dd-M-y';
$culture = 'fr_FR';
echo format_date($datedebut, $format, $culture);
jfsenechal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/11/2010, 18h03   #6
Candidat au titre de Membre du Club
 
Inscription : septembre 2009
Messages : 44
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 44
Points : 13
Points : 13
Désolé pour le retard dans la réponse,

voila mon schema pour les users :
Code :
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
USER_User:
  actAs: { Timestampable: ~ }
  tableName: user_user
  columns:
    id:                           {type: integer(4), notnull: true, primary: true, autoincrement: true}
    login:                        {type: string(50), notnull: true}
    mdp:                          {type: string(50), notnull: true}
    nom:                          {type: string(255), notnull: true}
    prenom:                       {type: string(255), notnull: true}
    mail:                         {type: string(255), notnull: false}
    date_arrivee:                 {type: date, notnull: true}
    centre_cout:                  {type: string(255), notnull: false}
    structure_rattachement_id:    {type: integer(4), notnull: false}
# on a supprime le not null pour charger les données
    type_contrat:
      type: enum
      values: [CDI, CDD, Stagiaire, Prestataire]
      default: CDI
    nature:
      type: enum
      values: [Interne CDI, Interne Stagiaire, Interne apprenti, Externe Forfait, Externe Régie]
      default: Interne CDI
    temps_travail: 	{type: integer(3), notnull: false}
    support_mobile:	{type: boolean, notnull: true , default: 0}
    commentaire:   	{type: string, notnull: false}
    id_demande :     {type: integer(4), notnull: false}
    etat:
      type: enum
      values: [Valide, En attente validation, Refusé, Supprimé]
      default: En attente validation
  relations:
    USERRoles :       {class: USER_Role, refClass: USER_Role_user, onUpdate: CASCADE, onDelete: CASCADE, local: user_id, foreign: role_id, foreignAlias: USERUsers}
    USERProfils:  {class: USER_Profil, refClass: USER_Profil_user, onUpdate: CASCADE, onDelete: CASCADE, local: user_id, foreign: profil_id, foreignAlias: USERUsers}
    USERPermissions:  {class: USER_Permission, refClass: USER_Permission_user, onUpdate: CASCADE, onDelete: CASCADE, local: user_id, foreign: permission_id, foreignAlias: USERUsers}
    STRUCTUREStructureRattachement:  {class: STRUCTURE_Structure, local: structure_rattachement_id, foreign: id, foreignAlias: USERUsers}
    STRUCTUREFonctions:      { class: STRUCTURE_Fonction, refClass: STRUCTURE_Fonction_user, onUpdate: CASCADE, onDelete: CASCADE, local: user_id, foreign: fonction_id, foreignAlias: USERUsers}
    USERDemandeCreationCompte: { class: USER_Demande_creation_compte,  foreign: fonction_id, onUpdate: CASCADE, onDelete: CASCADE, local: id_demande, foreign: id, foreignAlias: USERUsers}
    USERDemandeCreationCompte: { class: USER_Demande_creation_compte,  foreign: fonction_id, onUpdate: CASCADE, onDelete: CASCADE, local: id_demande, foreign: id, foreignAlias: USERUsers}
@jf_homer, je n'utilise pas l'admin generator et j'utilise le plugin jquery pour avoir un datetime picker.
bedomon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/11/2010, 17h46   #7
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Le schema me semble relativement bon, pour ce qui est du problème de date, même s'il reste discutable sur d'autres points.

Il n'y a pas de raison que tu n'arrives pas à initialiser le widget. Peux-tu mettre le code de la méthode configure() de l'objet form ?
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 09h59   #8
Candidat au titre de Membre du Club
 
Inscription : septembre 2009
Messages : 44
Détails du profil
Informations forums :
Inscription : septembre 2009
Messages : 44
Points : 13
Points : 13
Désolé pour le petit retard de réponse des imprévus, m'ont fait mettre de coté ce problème...

voici mon configure() :

Code :
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
    public function configure() {
        //redefinition de certains champs
        unset($this->validatorSchema['created_at']);
        unset($this->widgetSchema['created_at']);
        unset($this->validatorSchema['updated_at']);
        unset($this->widgetSchema['updated_at']);
 
        $context=sfContext::getInstance();
 
        if($this->getObject()->isNew() && ($context->getUser()->hasRole("admin_respire") || $context->getUser()->hasRole("admin_delegue_user") || $context->getUser()->hasFonction("chef_structure"))){
            unset($this->widgetSchema['etat']);
        }
 
        $this->widgetSchema['commentaire']->setAttribute("cols", '40');
        $this->widgetSchema['commentaire']->setAttribute("rows", '5');
        $this->widgetSchema['mail']->setLabel('E-mail');
        $this->widgetSchema['login'] = new sfWidgetFormInputText();
        $this->widgetSchema['date_arrivee'] = new sfWidgetFormDateJQueryUI(array('culture' => 'fr_FR'));
        $this->widgetSchema['date_arrivee']->setLabel('Date d\'arrivée');
        $this->widgetSchema['centre_cout']->setLabel('Centre de coût');
        $this->widgetSchema['structure_rattachement_id']->setLabel('Structure de rattachement');
        $this->widgetSchema['mdp'] = new sfWidgetFormInputPassword();
        $this->widgetSchema['mdp']->setLabel('Mot de passe');
        //ajout du widget pour la confirmation du mot de passe
        $remdp = new sfWidgetFormInputPassword();
        $this->widgetSchema['remdp'] = $remdp;
        $this->widgetSchema['remdp']->setLabel('Confirmation du mot de passe');
        $this->widgetSchema['support_mobile']->setDefault('1');
 
 
        $this->widgetSchema['nom']->setAttribute('class','long_input');
        $this->widgetSchema['prenom']->setLabel('Prénom');
        $this->widgetSchema['prenom']->setAttribute('class','long_input');
        $this->widgetSchema['mail']->setAttribute('class','long_input');
        $this->widgetSchema['temps_travail'] = new sfWidgetFormSelect(array('choices'=>array('0'=>'0', '50'=>'50', '60'=>'60', '80'=>'80', '100'=>'100')), array('required'=>true));
 
        //redefinition ds validateurs
        $this->setValidators(array(
            'mdp' => new sfValidatorAnd(
                    array(
                        new sfValidatorString(
                                array('required' => true, 'min_length' => 8, 'max_length' => 14),
                                array(
                                    'min_length' => 'Le mot de passe est trop court. 8 caractères minimum.',
                                    'max_length' => 'Le mot de passe est trop long. 14 caractères maximum.',
                                    'required' => 'Le mot de passe est obligatoire.',
                                    'invalid' => 'Le mot de passe doit contenir entre 8 et 14 caractères.'
                                )
                        ),
                        new sfValidatorRegex(
                                array('pattern' => "/^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*\W).{8,14}$/"),
                                array('invalid' => 'Le mot de passe est invalide.')
                        )
                    ),
                    array(),
                    array('invalid' => 'Le mot de passe doit contenir des caractères alphanumériques et des caractères spéciaux')
            ),
            'remdp' => new sfValidatorString(
                    array('required' => true, 'min_length' => 8, 'max_length' => 14),
                    array(
                        'min_length' => 'Le mot de passe est trop court. 8 caractères minimum.',
                        'max_length' => 'Le mot de passe est trop long. 14 caractères maximum.',
                        'required' => 'La confirmation du mot de passe est obligatoire.',
                        'invalid' => 'La confirmation du mot de passe doit contenir entre 8 et 14 caractères.'
                    )
            ),
            'date_arrivee' => new sfValidatorDate(
                    array('required' => true),
                    array('required' => 'La date d\'arrivée est obligatoire.')
            ),
            'nom' => new sfValidatorString(
                    array('required' => true, 'max_length' => 255),
                    array(
                        'required' => 'Le nom est obligatoire',
                        'max_length' => 'Le nom est trop long. 255 caractères maximum.'
                    )
            ),
            'prenom' => new sfValidatorString(
                    array('required' => true, 'max_length' => 255),
                    array(
                        'required' => 'Le prénom est obligatoire',
                        'max_length' => 'Le prénom est trop long. 255 caractères maximum.'
                    )
            ),
            'structure_rattachement_id' => new sfValidatorString(
                    array('required' => false),
                    array('required' => 'La structure de rattachement est obligatoire')
            ),
            'login' => new sfValidatorAnd(
                    array(
                        new sfValidatorString(
                            array('required' => false)
                        ),
                        new sfValidatorRegex(
                            array('pattern' => '/^[a-zA-Z0-9-]+$/'),
                            array('invalid'=>'Login : Seuls les caractères alphanumériques sont autorisés.')
                        )
                    ),
                    array('required' => false),
                    array()
            ),
            'mail' => new sfValidatorString(
                    array('required' => false)
            ),
            'temps_travail' => new sfValidatorNumber(
                    array('required' => true, 'min' => 0, 'max' => 100),
                    array(
                        'required'=>'Le temps de travail est obligatoire',
                        'invalid'=>'Le temps de travail doit être un nombre',
                        'min'=>'Le temps de travail minimum est 0',
                        'max'=>'Le temps de travail maximum est 100'
                    )
            ),
            'centre_cout' => new sfValidatorString(
                    array(
                        'max_length' => 255,
                        'required' => false
                    )
            ),
            'type_contrat' => new sfValidatorChoice(
                    array(
                        'choices' => array(
                            0 => 'CDI',
                            1 => 'CDD',
                            2 => 'Stagiaire',
                            3 => 'Prestataire'),
                        'required' => false
                    )
            ),
            'nature' => new sfValidatorChoice(
                    array(
                        'choices' => array(
                            0 => 'Interne CDI',
                            1 => 'Interne Stagiaire',
                            2 => 'Interne Apprenti',
                            3 => 'Externe Forfait',
                            4 => 'Externe Régie',
                            5 => 'Interne CDD'),
                        'required' => false
                    )
            ),
            'support_mobile' => new sfValidatorBoolean(
                    array('required' => false)
            ),
            'commentaire' => new sfValidatorString(
                    array('required' => false)
            ),
            'id' => new sfValidatorChoice(
                    array(
                        'choices' => array($this->getObject()->get('id')),
                        'empty_value' => $this->getObject()->get('id'),
                        'required' => false
                    )
            ),
        ));
 
        //définition du validator sur la comparaison des mots de passe
        $validatorPassword = new sfValidatorSchemaCompare('mdp', sfValidatorSchemaCompare::EQUAL, 'remdp');
        $validatorPassword->setMessage('invalid','Les mots de passe ne sont pas identiques.');
 
        $this->validatorSchema->setPostValidator(
                            new sfValidatorAnd(
                                array(
                                    $validatorPassword,
                                    new sfValidatorCallback(
                                            array(
                                                'callback' => array($this, 'checkDisponibiliteLogin'))))));
 
 
 
    }
EDIT : pour la culture j'ai essayé 'fr' mais cela ne change rien.
bedomon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/12/2010, 13h17   #9
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
[hors sujet]
C'est pour ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
            'type_contrat' => new sfValidatorChoice(
                    array(
                        'choices' => array(
                            0 => 'CDI',
                            1 => 'CDD',
                            2 => 'Stagiaire',
                            3 => 'Prestataire'),
                        'required' => false
                    )
            ),
que je n'aime pas du tout le type enum.
[/hors sujet]

A priori, et après deux lectures, ta déclaration me semble bonne.

Comment alimentes-tu ton form avec les données ?

Est-ce que, si tu mets une date, elle est correctement enregistrée ?
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 00h57   #10
Nouveau Membre du Club
 
Inscription : octobre 2008
Messages : 75
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 75
Points : 28
Points : 28
Bonjour à tous,

Je rencontre moi aussi le même problème.
bedomon, as-tu réussi à le résoudre ?

Moi dans mon configure() du form, j'ai mis :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
$this->setWidgets(array(
...,
'dtenc'    => new sfWidgetFormDateJQueryUI(array("change_month" => false, "change_year" => false, "culture" => sfContext::getInstance()->getUser()->getCulture())),
..., ...);
 
 
$this->setValidators(array(
...,
'dtenc'    => new sfValidatorDate(array('date_format' => '~(?P<day>\d{2})/(?P<month>\d{2})/(?P<year>\d{4})~', 'date_format_error' => 'dd/mm/YYYY', 'max' => 'yesterday', 'date_format_range_error' => 'd/m/Y')),
..., ...);
Et dans le settings.yml, j'ai bien
Code :
1
2
3
4
 
    i18n:                   true
    standard_helpers:       [Partial, Cache, I18N]
    default_culture:        es
(je le veux en espagnol, et le format de date devrait être dd/mm/YYYY)

Quelqu'un a-t-il une idée ?
Je suis un newbie sur symfony, je l'apprends en autodidacte, et je galère comme un fou malgrès les tutoriaux qui existent sur le web.

J'ai essayé pas mal de truc à ce sujet, mais rien n'y fait !

Merci à ceux qui pourront m'éclairer.

teraDev
teraDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2011, 09h04   #11
Membre habitué
 
Homme Jean-François
Développeur Web
Inscription : février 2003
Messages : 124
Détails du profil
Informations personnelles :
Nom : Homme Jean-François
Âge : 32
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : février 2003
Messages : 124
Points : 142
Points : 142
Hello,

Voici un exemple que moi j'utilise
Ca peut t'aider

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
<?php
$years = range(date('Y') - 65, date('Y') + 15);
 
$dateWidget = new sfWidgetFormI18nDate(array(
                    'format' => '%day% %month% %year%',
                    'month_format' => 'short_name',
                    'years' => array_combine($years, $years),
                    'culture' => 'fr'));
 
$date = new sfWidgetFormJqueryDate(
                        array(
                            'image' => '/images/calendar.png',
                            'culture' => 'fr',                         
                            'config' => '{yearRange: \'1940:2029\',
                                          changeYear: true,
                                          changeMonth: true}',
                            'date_widget' => $dateWidget));
jfsenechal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 02h33   #12
Nouveau Membre du Club
 
Inscription : octobre 2008
Messages : 75
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 75
Points : 28
Points : 28
Bonjour,

Pardon pour le retard dans la réponse, mais j'ai dû mettre de côté ce dev pour d'autres problèmes.

Merci jf_homer pour ta réponse. Cependant, je veux vraiment utiliser le sfWidgetFormDateJQueryUI, et celui ci n'a pas de paramètre 'date_widget'.

Mais j'ai trouvé la solution (pas des plus classe, mais bon).
Pour ceux que ça intéresse :
Dans le actionSuccess pour les listes :
Code :
1
2
3
4
5
6
7
 
<?php
use_helper('Date');
?> 
(...)
 
<?php echo format_date($mma_encuesta->getDtenc(),'p', sfContext::getInstance()->getUser()->getCulture()); ?>
Dans un formulaire :
J'ai dû modifier le code du sfWidgetFormDateJQueryUI (c'est ça qui est pas très classe) pour y rajouter une option format_date. Voilà ce que ça donne :
Code :
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
 
class sfWidgetFormDateJQueryUI extends sfWidgetForm
{
  /**
   * Configures the current widget.
   *
   * Available options:
   *
   * @param string   culture           Sets culture for the widget
   * @param boolean  change_month      If date chooser attached to widget has month select dropdown, defaults to false
   * @param boolean  change_year       If date chooser attached to widget has year select dropdown, defaults to false
   * @param integer  number_of_months  Number of months visible in date chooser, defaults to 1
   * @param boolean  show_button_panel If date chooser shows panel with 'today' and 'done' buttons, defaults to false
   * @param string   theme             css theme for jquery ui interface, defaults to '/sfJQueryUIPlugin/css/ui-lightness/jquery-ui.css'
   * 
   * @see sfWidgetForm
   */
  protected function configure($options = array(), $attributes = array())
  {
 
    if(sfContext::hasInstance())
     $this->addOption('culture', sfContext::getInstance()->getUser()->getCulture());
    else
     $this->addOption('culture', "en");
    $this->addOption('change_month',  false);
    $this->addOption('change_year',  false);
    $this->addOption('number_of_months', 1);
    $this->addOption('show_button_panel',  false);
    $this->addOption('theme', '/sfJQueryUIPlugin/css/redmond/jquery-ui-1.8.9.custom.css');
    $this->addOption('format_date', null);
 
 
    parent::configure($options, $attributes);
  }
 
  /**
   * @param  string $name        The element name
   * @param  string $value       The date displayed in this widget
   * @param  array  $attributes  An array of HTML attributes to be merged with the default HTML attributes
   * @param  array  $errors      An array of errors for the field
   *
   * @return string An HTML tag string
   *
   * @see sfWidgetForm
   */
  public function render($name, $value = null, $attributes = array(), $errors = array())
  {
    $attributes = $this->getAttributes();
 
    $input = new sfWidgetFormInput(array(), $attributes);
 
    if($this->getOption('format_date') != null){
    	$dateFormat = new sfDateFormat();
		$value = $dateFormat->format($value, $this->getOption('format_date'));
    }
 
    $html = $input->render($name, $value);
 
(...)

Et je l'appelle ensuite dans mon formulaire ObjectForm.class.php :
Code :
1
2
3
4
5
6
 
		$this->setWidgets(array(
(...)
			'dtenc'    => new sfWidgetFormDateJQueryUI(array("change_month" => false, "change_year" => false, "culture" => sfContext::getInstance()->getUser()->getCulture(), 'format_date' => 'dd/MM/y')),
 
(...)
Malheureusement, vous pouvez remarquer que le formattage symfony n'utilise pas le standard habituel. Normalement, en Java ou C ou PHP on utiliserait le format "dd/mm/YYYY", mais dans symfony il faut mettre "dd/MM/y" pour obtenir le même résultat. Ca non plus, c'est pas très classe de leur part !

A bientôt.
teraDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 09h55   #13
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Code intéressant.

Je suppose que tu as créé un nouveau widget plutôt que de modifier l'existant, ce n'est pas très claire dans tes explications.

Je ne comprend pas trop ton problème avec l'année. D'après le code de sfDateFormat il supporte y, yyy et yyyy pour l'année sur 4 digits, seul yy est réservé pour deux digits. Donc tu devrais supporter un format dd/MM/yyyy.

Jolie modification
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2011, 18h37   #14
Nouveau Membre du Club
 
Inscription : octobre 2008
Messages : 75
Détails du profil
Informations forums :
Inscription : octobre 2008
Messages : 75
Points : 28
Points : 28
Citation:
Envoyé par Michel Rotta Voir le message
Code intéressant.

Je suppose que tu as créé un nouveau widget plutôt que de modifier l'existant, ce n'est pas très claire dans tes explications.
Non, j'ai modifié l'existant. C'est justement pour ça que je dis que c'est pas très classe ! J'avoue que je n'ai qu'un mois sur symfony et je ne le maîtrise pas très bien. Entre autre, je n'ai pas encore bien étudié comment créer son propre widget. Idéalement dans ce cas, il devrait y avoir un moyen de créer un widget qui étend de sfWidgetFormDateJQueryUI et surcharger la méthode render.
Une autre option (presque meilleure pour moi) serait de créer un autre sfWidgetFormDateJQueryUI_perso qui étends de sfWidgetForm en redéfinissant tous les éléments de la classe. Je dis "meilleure" car plusieurs points me gênent un peu dans le sfWidgetFormDateJQueryUI original. Par exemple, si on ne veut pas le modifier, cela signifie qu'à chaque appel, il faut redonner le chemin du thème par défaut que l'on souhaite (si on ne veut pas utiliser le thème par défaut proposé). Je ne sais pas si je m'explique bien :
le thème par défaut de base est /sfJQueryUIPlugin/css/ui-lightness/jquery-ui.css mais moi dans toutes mes pages (sauf si je redéfini l'option thème), je veux utiliser par défaut /sfJQueryUIPlugin/css/redmond/jquery-ui-1.8.9.custom.css. Sans modification du widget, je serais obligé de repasser l'option "theme" à chaque appel, ce qui n'est pas très pratique.

Si vous avez des conseils pour améliorer le code, je suis preneur !

Citation:
Envoyé par Michel Rotta Voir le message
Je ne comprend pas trop ton problème avec l'année. D'après le code de sfDateFormat il supporte y, yyy et yyyy pour l'année sur 4 digits, seul yy est réservé pour deux digits. Donc tu devrais supporter un format dd/MM/yyyy.
Oui pardon, effectivement, dd/MM/yyyy marche aussi. Mais le format standard avec lequel j'avais l'habitude de travailler est dd/mm/YYYY ou d/m/Y (en respectant les majuscules minuscules), et là, dans symfony, ça ne marche pas. Le 'm' correspond à des minutes et non au mois, et le 'Y' correspond à ....... la lettre 'Y'.
Il aurait été préférable que symfony utilise les mêmes codifications que la fonction date() de php (http://php.net/manual/fr/function.date.php)

Merci pour la réponse.
teraDev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 10h06   #15
Modérateur
 
Avatar de Michel Rotta
 
Homme Michel Rotta
Responsable d'exploitation informatique
Inscription : septembre 2005
Messages : 4 913
Détails du profil
Informations personnelles :
Nom : Homme Michel Rotta
Âge : 49
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Responsable d'exploitation informatique
Secteur : Distribution

Informations forums :
Inscription : septembre 2005
Messages : 4 913
Points : 7 505
Points : 7 505
Créer un widget dans ton application est très simple, tu crées un dossier dans le dossier lib/ de ton projet et tu y mets le widget. Idéalement tu l'appel lib/widget/ mais en réalité, l'autoload s'en fiche.

Si tu mets une classe qui à le même nom qu'une classe de symfony ou d'un plugin tu la remplaces. Si non, tu ajoutes.

Créer un plugin n'est pas beaucoup plus compliqué et peut parfaitement être fait dans un deuxième temps. Ce qui rendra ta modification visible pour tous tes projets.

Modifier le code de l'existant est la plus mauvaise des solutions, notamment elle oblige à ne plus faire de mise à jour du code pour le plugin en question...

Après faut-il dériver ton nouveau widget de l'existant ou en créer un de toutes pièces je n'ai pas la réponse. Partant du principe de la factorisation du code j'aurais plutôt tendance à dériver dans un premier temps. Mais il faut que les modifications ne soient pas trop importante et il faut bien voir que cela risque d'avoir à t'obliger à installer un plugin pour que ton code fonctionne. L'autre solution (tout recréer) peut vite s'avérer rentable si les modifications sont très importantes.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher, il mangera toujours (Lao Tseu).
  • Pensez à valoriser les réponses pertinantes, cliquez sur le bouton vert +1 pour indiquer votre accord avec la solution proposée.
  • Pensez à utiliser la balise [code] pour afficher du code, elle est cachée sous le bouton [#] dans l'éditeur.
  • Une discussion est terminée ? Alors le bouton est votre ami !
Michel Rotta est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2011, 03h50   #16
Invité de passage
 
Inscription : janvier 2006
Messages : 1
Détails du profil
Informations forums :
Inscription : janvier 2006
Messages : 1
Points : 1
Points : 1
Personnellement, en bon fainéant, j'aime pas écrire 50 fois la même chose, alors lorsque j'ai souvent à utiliser les même widgets, je crée une classe dans lib/widget:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
class WidgetFormDateTime extends sfWidgetFormDateTime
{
	protected $_defaultOptions = array(
		'date' => array(
			'format' => '%day%/%month%/%year%'
		),
		'time' => array(
			'with_seconds' => true
		)
	);
 
	public function __construct($options = array(), $attributes = array())
	{
		parent::__construct(sfToolkit::arrayDeepMerge($this->_defaultOptions, $options), $attributes);
	}
}
Je vois plusieurs avantages à cela:
  • lorsque l'on bosse à plusieurs avec des personnes ayant déjà travaillé avec Symfony, changer le comportement de la classe originale peut être perturbant.
  • cela permet d'uniformiser les widgets dans l'application sans avoir à spécifier toutes les options de configurations à chaque fois (ca évite aussi les oublis et les grognements du client ^^)
  • cela permet de n'avoir qu'une modification unique à effectuer pour changer tous les widgets d'un même type dans toute l'application
  • si dans un cas particulier, j'ai besoin d'une autre configuration, je la spécifie lors de la création du widget (comme habituellement en fait)

Tout ceci en partant du principe que je n'ai pas de grosses modifications à effectuer par rapport à la classe originale, juste définir une configuration par défaut et/ou quelques méthodes à surcharger voire quelques options de widget à rajouter. Sinon opter pour la création complète d'un nouveau widget me parait plus approprié.

La création d'une classe portant le même nom qu'une déjà existante, que ce soit une classe symfony ou une classe issue d'un plugin, et de la placer dans le dossier lib/* pour qu'elle soit privilégiée par l'autoload est, à mon avis, une solution à n'utiliser qu'en dernier recours. Dans ce cas, la classe originale devient inutilisable et nécessite d'être entièrement réécrite.
emri est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h27.


 
 
 
 
Partenaires

Hébergement Web