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 :

Ignorer validation dans les formulaires


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 41
    Par défaut Ignorer validation dans les formulaires
    Bonjour à tous,

    J'ai un formulaire et je voudrais permettre à mes utilisateurs d'enregistrer leurs réponses pour venir compléter le formulaire plus tard s'ils n'ont pas fini.
    J'ai donc 2 boutons l'un "Enregistrer réponses" et l'autre "Valider réponses". Et je voudrais que lors de clic sur le 1er bouton (Enregistrer) il n'y ai pas de validation "required" car sinon évidemment on ne laisse pas la possibilité à l'utilisateur de remplir un formulaire incomplet et de l'enregistrer...

    Et malheureusement je n'arrive pas à faire cela, quelqu'un aurait-il une idée de comment je pourrais faire?

    Je pensais à quelque chose comme ca...
    (action.class.php)
    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
    if ($request->isMethod('post') && ($request->getPostParameter('action') == 'Valider'))
      {
        $this->form->bind($request->getParameter('profile'));
     
        if ($this->form->isValid())
        {
            $this->form->save();
            $this->redirect('home/index');
        }
      }
     
      elseif ($request->isMethod('post') && ($request->getPostParameter('action') == 'Enregistrer')){
          $this->form->bind($request->getParameter('profile'));
          $this->form->save();
          $this->redirect('home/index');}
    Mais je pense que je suis sur la mauvaise voie, vu que les validators sont deja créé dans mon ProfileForm.class.php...


    Merci d'avance à toute personne pouvant m'apporter une petite aide!

  2. #2
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Personnellement, je créerais une seconde classe ProfileTmpForm qui hérite de ProfileForm et dans laquelle tu règles tes validateurs comme tu veux, puis j'instancierai l'une ou l'autre classe selon les paramètres de la requête.

    Autre solution, ajouter à ProfileForm une méthode pour modifier ses validateurs et appeler cette méthode avant le bind() en fonction des paramètres de la requête.

  3. #3
    Membre averti
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 41
    Par défaut
    Merci pour ta réponse Herode,

    Effectivement la création d'une classe ProfileTmpForm me parait être la bonne solution!

    Par contre une fois créée, j'ai supprimé la partie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $this->setValidators(array(......))
    Et lorsque j'enregistre mon formulaire (donc en instanciant la classe ProfileTmpForm) j'ai deux erreurs:

    Mon premier champ est donné comme invalid: "$formTmp['provider'] (sfWidgetFormChoice)
    Invalid."
    C'est une liste et bizarrement lorsque je choisi le 2e de la liste je n'ai plus d'erreur...

    Et j'ai un "CSRF attack detected":
    "$formTmp['_csrf_token'] (sfWidgetFormInputHidden)
    CSRF attack detected."


    Je sais pas trop comment corriger ca...

  4. #4
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    justement tu devrais mettre le setValidator() pour qu'il ta validation à toi pas celle par défaut.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->setValidator(array('required' => false, ...));
    Ton symfony est configurer pour vérifier la validité du formulaire émis, tu as peut être dût supprimer ce champs là.

  5. #5
    Membre averti
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 41
    Par défaut
    Ah oui effectivement j'ai pas été très maline là... Merci kenny.kev.

    J'ai résolu le problème de "CSRF attack detected", en insérant dans mon template:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo $formTmp['_csrf_token']->render()?>
    Ca marche nickel maintenant.

    Merci à vous deux pour votre aide

  6. #6
    Membre émérite Avatar de Herode
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2005
    Messages
    825
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 825
    Par défaut
    Pour le jeton CSRF, si tu ne t'en sers pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	$this->disableLocalCSRFProtection();
    à placer dans la méthode configure() du formulaire par exemple, fait aussi l'affaire

  7. #7
    Membre averti
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 41
    Par défaut
    Bon je suis désolé mais j'ai identifié un nouveau point sur lequel je bloque...!

    Lorsque l'utilisateur a enregistré son profil (pour revenir le compléter plus tard, avec les validateurs required à false) les champs non remplis sont mis à 0. Du coup quand il revient s'il valide son profil, cette fois les validateurs required sont forcément bon et cela même si l'un des champs n'a pas été rempli (puisqu'il aura été mis à 0 lors de l'enregistrement précédemment...).
    Ce qui pose forcément de gros problème d'autoriser la validation avec certains champs non remplis.

    Comment faire pour éviter cela? Je n'arrive pas à trouver de solution...

  8. #8
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    tu as surement un problème niveau bdd car la c'est que tu as dût mettre not null à true.

    Attention les required à true par défaut sont dû au fait que tu as mis not null à true, donc vu qu'il n'a pas le droit au NULL alors il met la valeur de false.

    Il ne faut pas oublié de le modifier dans la schema.yml aussi

  9. #9
    Membre averti
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 41
    Par défaut
    Non en fait je n'ai rien déclaré dans ma table à part le type...
    schéma.yml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Profile:
      tableName: profile
      columns:
        user_id: integer(20)
        subscription: string(50)
        expenses: integer(20)
    subscription étant une liste (sfWidgetFormChoice), et expenses un input (sfWidgetFormInputText)

    J'ai essayé comme test de faire comme ci-dessous, mais ca ne marche pas non plus. Ca ajoute toujours "0" lorsque l'utilisateur enregistre son profil.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Profile:
      tableName: profile
      columns:
    ...
        expenses: {type: integer(20), notnull: false, default: null}
    Comment faire pour enregistrer NULL lorsque le champ n'est pas rempli?

  10. #10
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    et dans ta bdd tu as mis quoi pour ce champ ?

  11. #11
    Membre averti
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 41
    Par défaut
    C'est à dire dans ma bdd?

    Je n'ai rien défini d'autre que dans le fichier schema.yml...

    J'ai comme structure dans ma base, pour cette table:
    Champ: expenses
    Type: bigint(20)
    Null: Oui
    Défaut: NULL

    Merci encore, c'est vraiment sympa de m'aider!

  12. #12
    Membre émérite Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Par défaut
    Tu peux m'afficher le code qui te permet d'enregistrer l'utilisateur s'il te plait ?

  13. #13
    Membre averti
    Femme Profil pro
    Inscrit en
    Novembre 2011
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Novembre 2011
    Messages : 41
    Par défaut
    En fait c'est un profile qui ne se rapporte pas directement à mon sfGuardUser. J'ai aussi un sfGuardUserProfile, mais là c'est dans un module "profile" indépendant...

    Mon code pour enregistrer le profile:
    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
    public function executeFacturation(sfWebRequest $request)
      {
          $profile_membre= new Profile();
          $id = $this->getUser()->getGuardUser()->getId();
          $profile_membre=Doctrine::getTable('Profile')->findOneByUserId($id);
          $this->form = new ProfileForm($profile_membre);
          $this->formTmp = new ProfileTmpForm($profile_membre);
     
      if (($request->isMethod('post')||$request->isMethod('put')) && ($request->getPostParameter('action') == 'Valider'))
      {
        $this->form->bind($request->getParameter('profile'));
        $this->form->getObject()->setUserId($this->getUser()->getGuardUser()->getId());
     
        if ($this->form->isValid())
    {
            $this->form->updateObject();
            $this->form->save();
            $this->redirect('savings/index');
        }
      }
      elseif (($request->isMethod('post')||$request->isMethod('put')) && ($request->getPostParameter('action') == 'Enregistrer')){
          $this->formTmp->bind($request->getParameter('billing_profile'));
          $this->formTmp->getObject()->setUserId($this->getUser()->getGuardUser()->getId());
          if ($this->formTmp->isValid())
        {
          $this->formTmp->updateObject();
          $this->formTmp->save();
          $this->redirect('savings/index');
        }
      }
    Mon code pour formTmp (vu que c'est celui qui pose problème...)
    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
    public function configure()
      {
        unset(
          $this['created_at'],
          $this['updated_at']
        );
     
        $this->setWidgets(array(
          'provider' => new sfWidgetFormChoice(array('choices' => array('p1'=>'p1','p2'=>'p2'))),
          'expenses'   => new sfWidgetFormInputText(),
            ));
     
         $this->widgetSchema->setLabels(array(
          'provider'             => 'Quel est votre fournisseur? ',
          'expenses'  => 'Combien cela vous a couté?',
        ));
     
    $this->setValidators(array(
     
         'provider'         => new sfValidatorString(
              array('required' => true),
              array('required'   => '*Vous n\'avez pas saisi votre puissance souscrite',)),
          'expenses'         => new sfValidatorString(
             array('required' => false)),
        ));
     
     
      $this->disableLocalCSRFProtection();
     
    //  $this->widgetSchema->setFormFormatterName('list');
      $this->widgetSchema->setNameFormat('profile[%s]');
     
      }
    }
    Merci encore pour ton aide.

Discussions similaires

  1. Réponses: 29
    Dernier message: 01/07/2006, 09h23
  2. Vérifier si mail valide ’@.’ dans un formulaire
    Par Chansonnette dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 12/06/2006, 14h09
  3. [débutant] Erreur dans les formulaires
    Par mytika dans le forum Access
    Réponses: 7
    Dernier message: 18/05/2006, 15h57
  4. Validation dans les tables
    Par Isabelle27 dans le forum Access
    Réponses: 8
    Dernier message: 02/05/2006, 15h14
  5. [W3C] Nombre de caractère dans les formulaires
    Par oranoutan dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 12/12/2005, 01h37

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