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 02/02/2012, 12h26   #1
Invité régulier
 
Homme
Étudiant
Inscription : juin 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 22
Points : 9
Points : 9
Par défaut [sf 1.4.x] validateur de date + d'heure dans des champs séparés (DB)

Bonjour,
j'aimerais avoir des précisions pour les validateurs de symfony.

J'ai une table d’évènement dans ma DB qui contient des champs ['date_debut'], ['date_fin'], ['heure_debut'], ['heure_fin'].
J'aimerai créer un validateur qui permet de tester la saisie de ces champs : 'date_début' doit être <= à la 'date_fin'.
Et si la 'date_début' == 'date_fin', alors 'heure_début' doit-être < 'heure_fin'...

Pour la première condition, c'est OK j'ai trouvé la solution avec
Code :
$this->validatorSchema->setPostValidator(new sfValidatorSchemaCompare(...
mais je n'arrive pas à gérer la deuxième condition...

J'ai essayé cette technique www.developpez.net/.../validator-test-formulaire/ mais sans succès. Pouvez-vous me dire si je suis sur la bonne voie ou s'il vaudrait mieux créer une class pour un validateur personnalisé sachant que je débute avec symfony... ?

Merci pour vos messages.

Voici le code qui pose problème actuellement :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
//On vérifie que la date de début est antérieure ou égale à la date de fin
        $this->validatorSchema->setPostValidator(
                new sfValidatorSchemaCompare('date_debut', sfValidatorSchemaCompare::LESS_THAN_EQUAL, 'date_fin',
                        array('throw_global_error' => true),
                        array('invalid' => 'La date et heure de début doit être antérieure ou égale à la date et heure de fin')
                //array('invalid' => 'La date de début ("%left_field%") doit être antérieure ou égale à la date de fin ("%right_field%")')
                )
        );
 
        //On vérifie les heures de début et fin
        $this->validatorSchema->setPostValidator(
                new sfValidatorAnd(array(new sfValidatorCallback(array('callback' => array($this, 'checkDateTime')))))
        );
et la fonction checkDateTime()
Code :
1
2
3
4
public function checkDateTime($validator, $values) {
        if( ($values['date_debut'] == $values['date_fin']) && ($values['heure_debut'] >= $values['heure_fin']) )
                $error["date_debut"] = new sfValidatorError($validator, $message);
    }
miam84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 13h20   #2
Membre habitué
 
Inscription : juin 2006
Messages : 488
Détails du profil
Informations forums :
Inscription : juin 2006
Messages : 488
Points : 116
Points : 116
je voie pas trop l'interet de séparer la date de l'heure.
En ayant un champ Debut (DATETIME) et un champ FIN (DATETIME)
Tu n'as plus qu'à comparer tes 2 champs.
erictomcat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 14h13   #3
Invité régulier
 
Homme
Étudiant
Inscription : juin 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 22
Points : 9
Points : 9
Citation:
Envoyé par erictomcat Voir le message
je voie pas trop l'interet de séparer la date de l'heure.
En ayant un champ Debut (DATETIME) et un champ FIN (DATETIME)
Tu n'as plus qu'à comparer tes 2 champs.
Oui je suis entièrement d'accord cela aurait été beaucoup plus simple, mais la base est déjà existante, je ne peux donc pas la modifier...
miam84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 15h39   #4
Membre habitué
 
Avatar de Nico_F
 
Homme Nicolas
Développeur Web
Inscription : avril 2011
Messages : 96
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : Communication - Médias

Informations forums :
Inscription : avril 2011
Messages : 96
Points : 143
Points : 143
Code :
1
2
3
4
5
6
7
8
9
10
11
 
//On vérifie que la date de début est antérieure ou égale à la date de fin
$this->validatorSchema->setPostValidator(new sfValidatorAnd(array(
  new sfValidatorSchemaCompare('date_debut', sfValidatorSchemaCompare::LESS_THAN_EQUAL, 'date_fin',
    array('throw_global_error' => true),
    array('invalid' => 'La date et heure de début doit être antérieure ou égale à la date et heure de fin')
  ),
  new sfValidatorCallback(array(
  	'callback' => array($this, 'checkDateTime')
  ))
)));
Je n'ai pas testé ton callback, mais réécrit comme ça, ça me parle un peu plus. Peux-tu être un peu plus précis sur les erreurs que tu rencontres (quels sont les messages d'erreur, ou au contraire s'il n'y a pas d'erreur relevée ?)
Nico_F est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 11h20   #5
Invité régulier
 
Homme
Étudiant
Inscription : juin 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 22
Points : 9
Points : 9
Hello Nico,
merci pour ton message.
Voici l'erreur retournée par ce validateur... :
Code :
Warning: Invalid argument supplied for foreach() in .../lib/vendor/symfony/lib/plugins/sfDoctrinePlugin/lib/form/sfFormDoctrine.class.php on line 169 Call Stack: 0.0000 347636 1. {main}()
et voilà là où visiblement l'erreur intervient :
Code :
1
2
3
 new sfValidatorCallback(array(
                                'callback' => array($this, 'checkDateTime')
                            ))
miam84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 17h55   #6
Membre habitué
 
Avatar de Nico_F
 
Homme Nicolas
Développeur Web
Inscription : avril 2011
Messages : 96
Détails du profil
Informations personnelles :
Nom : Homme Nicolas
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : Communication - Médias

Informations forums :
Inscription : avril 2011
Messages : 96
Points : 143
Points : 143
Mmmh,

Tu pourrais dumper $validator et $values histoire de t'assurer qu'il s'agit bien des bons types d'objets et qu'ils contiennent ce qu'ils sont censés contenir ?

Le message d'erreur laisse penser que tu donnes un form à la place d'un validateur dans ta méthode checkDateTime() par exemple (ou quelque chose dans ce gout là...)

Vérifie que tu as le bon type d'objet et qu'ils sont correctement remplis.
Nico_F est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 14h10   #7
Invité régulier
 
Homme
Étudiant
Inscription : juin 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 22
Points : 9
Points : 9
Citation:
Envoyé par Nico_F Voir le message
Mmmh,

Tu pourrais dumper $validator et $values histoire de t'assurer qu'il s'agit bien des bons types d'objets et qu'ils contiennent ce qu'ils sont censés contenir ?

Le message d'erreur laisse penser que tu donnes un form à la place d'un validateur dans ta méthode checkDateTime() par exemple (ou quelque chose dans ce gout là...)

Vérifie que tu as le bon type d'objet et qu'ils sont correctement remplis.
Hélas tout me semble bon...

si je dump dans ma fonction checkDateTime() j'ai pour values :
Code :
1
2
3
4
5
6
7
8
9
10
Array
(
    [designation] => Evenement
    [date_debut] => 2012-02-08
    [heure_debut] => 18:00:00
    [date_fin] => 2012-02-08
    [heure_fin] => 11:00:00
    [id] => 
    [_csrf_token] => dc73c5e5aaa7e6440c08074031d5bf34
)
et pour $validator:
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
sfValidatorCallback Object
(
    [requiredOptions:protected] => Array
        (
            [0] => callback
        )
    [defaultMessages:protected] => Array
        (
            [required] => Le champs est requis.
            [invalid] => Le format est invalide.
        )
 
//... autre defaut messages and co, puis ...
 
   [options:protected] => Array
        (
            [required] => 
            [trim] => 
            [empty_value] => 
            [arguments] => Array
                (
                )
            [callback] => Array
                (
                    [0] => SortieForm Object
                        (
                            [isNew:protected] => 1
                            [object:protected] => Sortie Object
                                (
                                    [_node:protected] => 
                                    [_id:protected] => Array
                                        (
....
Tout me semble donc bon... Mais l'erreur est toujours présente... J'ai beau bidouiller dans tous les sens, ça ne fait pas grand effet....

Mais je suis en train de me demander si je met bien tout au bon endroit...
Je dois bien mettre mon $this->validatorSchema->setPostValidator je dois le mettre dans le configure de lib/form/SortieForm.class.php et ma fonction checkDateTime() je dois le mettre en tant que methode de ce même fichier ? Ou est-ce que je dois étendre un validateur pour y mettre ma méthode checkDateTime () ?
miam84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 14h36   #8
Invité régulier
 
Homme
Étudiant
Inscription : juin 2011
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2011
Messages : 22
Points : 9
Points : 9
Ok, ben après plusieurs jours de recherches, j'ai finalement trouvé une solution...

Le problème semble venir de :
Code :
$error["date_debut"] = new sfValidatorError($validator, $message);
mais je ne sais pas pourquoi... (ce n'est pas $message, car malgré que je ne l'ai pas affiché dans mon premier poste, $message était bien déclaré dans checkDateTime() )

Voici ma fonction de callback qui fonctionne à présent...
Code :
1
2
3
4
5
6
7
8
9
public function checkDateTime($validator, $values) {
 
        if (($values['date_debut'] == $values['date_fin']) && ($values['heure_debut'] >= $values['heure_fin'])) {
            $message = 'L\'heure de fin doit être après l\'heure de début !';
            throw new sfValidatorError($validator, $message);
        } else {
            return $values;
        }
    }
C'est suffisant pour moi, je marque ce sujet comme résolu.
Merci à vous qui avez réfléchi à mon problème.
A bientôt
miam84 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h22.


 
 
 
 
Partenaires

Hébergement Web