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

Symfony PHP Discussion :

[Validator] Test pour formulaire


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 2
    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

  2. #2
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 12
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
    }

  3. #3
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 2
    Par défaut
    Merci beaucoup, j'ai réussi à faire ce que je voulais.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $this->validatorSchema->setPostValidator(
         new sfValidatorAnd(array(
         new sfValidatorCallback(array('callback' => array($this,'checkEmployes'))))
       ));
    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
     
      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

  4. #4
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    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.

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 12
    Par défaut
    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.

  6. #6
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    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.

Discussions similaires

  1. message d'erreur pour la validation d'un formulaire
    Par cyriane dans le forum VB.NET
    Réponses: 1
    Dernier message: 15/05/2012, 11h26
  2. Réponses: 1
    Dernier message: 15/08/2008, 02h41
  3. Validate ActionForm pour formulaire prérempli
    Par stylatone dans le forum Struts 1
    Réponses: 7
    Dernier message: 31/01/2008, 16h56
  4. Validation simple de formulaire pour un nul
    Par sawati dans le forum Général JavaScript
    Réponses: 15
    Dernier message: 05/01/2008, 15h03
  5. Help pour ouverture d'un popup lors de la validation d'un formulaire
    Par vrossi59 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/07/2006, 19h57

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