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 07/01/2011, 11h15   #1
Invité de passage
 
Pierre Lachaux
Inscription : janvier 2011
Messages : 2
Détails du profil
Informations personnelles :
Nom : Pierre Lachaux

Informations forums :
Inscription : janvier 2011
Messages : 2
Points : 0
Points : 0
Par défaut [Validator] Test pour formulaire

Bonjour,

Première question:

J'ai un formulaire avec un champ pour le nombre total d'employés, et deux champs pour les employés techniciens et les employés ingénieurs.
Je voudrais faire un test pour que le nombre de techniciens plus le nombre d'ingénieurs soit inférieur ou égal au nombre total d'employés mais je ne vois pas comment faire.
Les deux champs techniciens et ingénieurs ne sont pas obligatoirement renseignés.

Deuxième question:

Dans mon formulaire, j'ai un champ testé avec sfValidatorNumber. Mon problème est que je voudrais que l'utilisateur puisse entrer des décimales avec une virgule en plus des décimales avec un point.
Il faudrait donc que je transforme les virgules en point automatiquement lors de l'envoie du formulaire mais je ne vois pas à quel endroit je pourrais faire cela.

Merci d'avance pour votre aide
PierreLachaux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/01/2011, 11h32   #2
Nouveau Membre du Club
 
Homme
Développeur Web
Inscription : juillet 2007
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur Web
Secteur : Tourisme - Loisirs

Informations forums :
Inscription : juillet 2007
Messages : 12
Points : 25
Points : 25
Bonjour,

je ne serais trop te conseiller de commencer a voir les postValidator qui te permettent de valider certaines valeurs de ton formulaire mais avec une méthode qui n'est pas celle des validateurs classiques de symfony.

du coup les champs de ton formulaire ne sont que des inputs et tu vérifies les valeurs grâces a ces méthodes qui sont appelées pour la validation de ton formulaire.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
$this->validatorSchema->setPostValidator(
new sfValidatorAnd(array(
new sfValidatorCallback(array('callback' => array($this, 'maFonction'))))
));
 
public function maFonction($validator, $values)
{
//la valeur des champs de ton formulaire sont dans values
$values["nom_d_un_champ_de_ton_formulaire"]
 
//pour les erreurs
$error["nom_de_ton_champ_en_erreur"]=new sfValidatorError($validator, $message);
}
GaapTap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 11h15   #3
Invité de passage
 
Pierre Lachaux
Inscription : janvier 2011
Messages : 2
Détails du profil
Informations personnelles :
Nom : Pierre Lachaux

Informations forums :
Inscription : janvier 2011
Messages : 2
Points : 0
Points : 0
Merci beaucoup, j'ai réussi à faire ce que je voulais.

Code :
1
2
3
4
5
 
$this->validatorSchema->setPostValidator(
     new sfValidatorAnd(array(
     new sfValidatorCallback(array('callback' => array($this,'checkEmployes'))))
   ));
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
  public function checkEmployes($validator, $values){
 
    //test du nombre de techniciens et d'ingénieurs
    if($values["technicians"] + $values["engineers"] > $values["employed"]){
      $error = new sfValidatorError($validator, 'Invalide');
 
      // Affichage des erreurs
      if($values["technicians"] == 0)
        throw new sfValidatorErrorSchema($validator, array('engineers'=>$error));
      else if($values["engineers"] == 0)
        throw new sfValidatorErrorSchema($validator, array('technicians'=>$error));
      else
        throw new sfValidatorErrorSchema($validator, array('technicians'=>$error,'engineers'=>$error));     
    } 
  }
Si quelqu'un a une idée pour ma deuxième question, je suis toujours preneur
PierreLachaux est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2011, 13h11   #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
Pour la première question, manifestement cela marche. Je suis un peu surpris par l'utilisation d'un sfValidatorErrorSchema dans ta fonction callback, je n'y avait jamais pensé, il faut que je me teste cela.

Tu dois pouvoir simplifier ton postValidateur, si tu n'as qu'une condition à tester il ne sert à rien de le mettre dans un sfValidatorAnd.


@GaapTap tu dis : "les postValidator qui te permettent de valider certaines valeurs de ton formulaire mais avec une méthode qui n'est pas celle des validateurs classiques de symfony"

En fait le postValidateur (il est unique) permet de tester des données une fois les validateurs individuels passé, généralement ce que l'on ne peut pas faire sur des individuel, c'est a dire des données issues de plusieurs champs. Rien n’empêche qu'elles soient traitée par des validateurs "standard".

Il existe un validateur, le sfValidatorCallback qui lui permet de valider des données "avec une méthode qui n'est pas celle des validateurs classiques de symfony"


Pour la deuxième question.
Je pense que le plus simple est d'écrire un nouveau validateur. C'est beaucoup plus simple à faire qu'à écrire ici

Tu peux le créer dans ton application, dans un dossier /lib/validators et tu l'appel comme tu le veux. Le plus simple serait de soit dériver sfValidatorNumber, soit de repartir directement de sfValidatorBase et de t'inspirer de sfValidatorNumber pour ton code.

Il te revient de réécrire la méthode doClean() qui, simultanément, nettoie la valeur retournée et la valide. Attention malgré tous à ce que l'utilisateur peut te retourner, il est capable de renvoyer un truc dans le genre 1234.56 ou 1234,56 mais aussi 1 234.56 ; 1,234.56 ; 1 234,56 ; 1.234,56 ...

Il y a ici plein d'informations et de truc autour de la fonction is_numeric.
__________________
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 12/01/2011, 08h33   #5
Nouveau Membre du Club
 
Homme
Développeur Web
Inscription : juillet 2007
Messages : 12
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Développeur Web
Secteur : Tourisme - Loisirs

Informations forums :
Inscription : juillet 2007
Messages : 12
Points : 25
Points : 25
La méthode setPostValidator ne peut contenir qu'un objet héritant ou de type sfvalidatorBase.

Parmi les objets l'on peut utiliser sfValidatorAnd qui peut contenir un tableau d'objets validators basé sur sfValidatorBase. On l'utilise généralement pour plusieurs validators personnel à exécuter.

Nous avons aussi sfValidaorCallBack qui lui ne fait appel qu'a une seule méthode de validator personnelle.

Donc pour finir pourquoi utiliser l'expression "les postValidators" ?
Parce que vu ce qu'il veut faire, je ne vais pas réinventer un validator qui va demander plus de travail pour juste un . au lieu d'une , comme tu le soumets.

Mais refaire un postValidator avec une expression régulière un preg_match_replace une réinjection dans les values, ce qui contiendra 3 lignes de codes.

Donc oui il lui serait souhaitable qu'il utilise les postValidators dans son cas.

un Postvalidator pour les techniciens
un PostValidator pour remplacer son . par sa ,

Après il est bon qu'une personne a qui l'on donne une piste, un conseil, un bout de code, fasse lui aussi des recherches.
GaapTap est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/01/2011, 10h44   #6
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
Je ne suis pas bien sur de voir la différence que tu mets entre les validators et les pre et post validator.

En effet tant pour les validator "normal" directement rattachés à un champ que pour les preValidator et postValidator, ils ne peuvent avoir comme élément que des enfants de sfValidatorBase. Ce qui est le cas de tous les validateurs.

C'est plus une question de quant la validation aura lieu qui est intéressante ici.

Pour le cas exposé ici, valider et nettoyer une donnée, je ne vois pas en quoi un validateur sfValidatorRegex pourrait répondre à la demande. En effet, il pourra valider la demande, mais il ne pourra nettoyer la chaine pour en faire un nombre valide (ce qui est bien dommage, il y a peut-être, là, un nouveau validateur a créer).

Je ne vois pas plus l'intérêt de dissocier le validateur du champ pour le mettre dans un postValidateur. On va perdre la liaison directe entre la valeur et la validation et on ne pourra nettoyer la valeur.

Créer un validateur n'est pas quelque chose de très compliquer et je reste convaincu qu'il y a souvent avantage à créer un nouveau validateur plutôt que d'utiliser le sfValidatorCallback, sauf s'il n'y a qu'une fonction à utiliser et pas de code spécifique à mettre en œuvre.
__________________
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
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h37.


 
 
 
 
Partenaires

Hébergement Web