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 :

[Form] Appliquer une contrainte sur un champ texte, en fonction de la valeur d'un autre élément du formulaire [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut [Form] Appliquer une contrainte sur un champ texte, en fonction de la valeur d'un autre élément du formulaire
    Hello,

    Voilà quelque chose qui me parait simple à réaliser manuellement, mais qui se transforme en chemin de croix avec sf.

    Dans un formulaire, possédant un champ texte, et une case à cocher.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <form name="f_someform">
    Texte : <input type="text" /><br/>
    Case à cocher : <input type="checkbox" /><br/>
    <input type="submit" value="soumettre" />
    </form>
    J'ai une contrainte à appliquer sur le champ texte, par exemple 'required'.
    Mais celle ci ne doit être appliquer que si la case à cocher est cochée.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if( case_a_coche.is_checked )
        validate( text_field )
    else
        // text_field is ignored
    Je ne trouves actuellement pas d'informations sur ce cas de figure, malgré mes séances googling et autres tentatives plus vaines les unes que les autres.

    Par ailleurs, la ml ne répond pas, la doc n'en dis mot, et si vous avez tenté de lire les classes de Form, vous en conviendrez c'est trop très compliqué.

    Bref, je suis dans l'impasse, d'autant plus que ce composant est franchement très imbriqué, de plus, il est très obscure.

    Alors si vous avez une idée, une piste, un exemple, ou tout simplement la solution, cela m'enleverez une belle épine du pied, et m'éviterait de devoir une fois encore me plier à ce qu'il est possible de faire, et non ce que je souhaite.

    merci,
    a+

  2. #2
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Je pense que tu peux t'en sortir avec les validation groups : http://symfony.com/doc/current/book/...idation-groups
    L'idee c'est que tu peux valider de plusieurs facon une meme entite. Imaginons un groupe "case cochee" qui contient un validateur required sur ton texte, et un group "case non cochee" qui ne contient aucun validateur en fait.

    Apres, il faut que tu trouves comment appliquer tel groupe en fonction du formulaire soumis par ton visiteur. Ca ne doit pas etre tres compliquer, rajoute ton code avant ton $form->isValid() et ca devrait le faire je pense.

    Sinon globalement je suis d'accord avec toi, la doc est encore bien maigre, mais la doc sur les forms est quasi inexistante.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    Ou utiliser le callback ?
    Un petit si la réponse convient. Merci.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    hello,

    merci à vous deux pour vos réponses !

    Alors pour les groupes, ils m'avaient cligné de l'oeil à moi aussi pour ce problème.
    Cependant, ma validation (ou non) du champs texte, doit se faire lors de l'exécution des contraintes.
    Alors que les groupes, comme indiquées ici http://symfony.com/doc/current/book/...idation-groups, permettent de sélectionner les contraintes à la déclaration du formulaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $form = $this->createFormBuilder($users, array(
            'validation_groups' => array('registration')
        )
        // ...
    ;
    Hors, je pense que si je modifie les contraintes du formulaire juste avant la validation, le framework refusera de valider le formulaire, puisque la déclaration de celui ci ne sera plus égale à celui utiliser pour valider l'input.
    Sa restent intéressant, je vais creuser cette idée.

    Pour le callback, c'est une bonne idée aussi à creuser, cependant, je vais être obligé de ré implémenter toutes mes contraintes connexes dans le callback.

    Car si mon champs doit être
    required
    email
    +callback

    Pour l'instant, je ne vois pas comment dire au framework de ne pas tester required et email, si dans mon callback je détecte que ce n'est pas nécessaire.
    Dès lors, je vais devoir implémenter ces contraintes dans le callback,
    mais je perds donc l'intérêt du framework qui est fait pour centraliser mes contraintes et ne pas les répéter
    Par ailleurs, dans ce cas là, autant tout mettre dans le contrôleur, au moins ce sera simple à maintenir.
    De plus rien ne dis que mon callback sera exécuté en premier.

    Faut que je teste tout cela, tout cela n'est que suppositions et hypothèses.

    Je vous tiens au jus,
    a+

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Points : 658
    Points
    658
    Par défaut
    Je dirais le callback tout seul.
    Tu peux toujours faire appel a la validation si besoin s'en fait sentir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $validator->validate(...)
    (http://symfony.com/doc/current/book/validation.html)

    Je ne connais pas les possibilités de validation_groups; c'est peut etre la solution.
    Un petit si la réponse convient. Merci.

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Hello,

    encore merci pour votre aide.

    Bon finalement j'ai utiliser les groupes de validation.

    Je suis pas bien heureux de cette solution,
    - elle est bizarre
    - L'ergonomie est nul, j'ai une double validation, d'un coté les jolie required du formulaire, de l'autre des raw messages qui popent au milieu du formulaire.
    - Je me pose des question quand à la viabilité de cette solution dans le cas de maj.
    - J'ai dû mélangé mes contraintes de formulaire dans mes entités
    - Je reste surpris d'avoir pu afficher un formulaire avec le groupe1, et le valider avec un groupe2.

    'Fin bon bref, en tant qu'end user je suis pas là pour faire du beau code,
    suis un peu dégoûté quand même.

    a+, merci.

  7. #7
    Membre éclairé
    Avatar de djayp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    295
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 295
    Points : 687
    Points
    687
    Par défaut
    Salut,

    je pense que tu devrais pouvoir gérer cela plus depuis ton entité :

    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
     
    class mon_entite {
        private $foo;
        private $bar;
     
        /**
         * @Assert\True(message = "Bar is required when foo is checked")
         */
        public function isFooCheck()
        {
            if($this->foo == 1 and empty($this->bar)) {
                return false;
            }
            return true;
        }
        // ...
    }
    A++

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Points : 2 284
    Points
    2 284
    Par défaut
    Hello,

    Merci pour ta réponse.

    Dans ce cas là, j'ai une contrainte qui m'oblige à remplir le texte, au niveau de la bdd.
    Hors justement, je voulais être free de ce point de vu là, car cette contrainte n'est pas vérifiée à tous les moments de l'appli.
    Et je ne trouve pas du tout logique, si par exemple demain j'écris un script d'import en CLI, d'avoir à indiquer que has_checked=false si je veux un texte à blanc.

    C'est une contrainte qui n'à de sens que dans le formulaire.

    D'où mon désir de mettre cela dans le form, et non dans un assert.

    Ai je faux dans mon raisonnement ? Je débute encore sur cet outil.

    Si tu le souhaites je peux travailler sur un code plus concret et le poster.
    J'avais voulu faire cela l'autre jour, mais je me suis arrêter en chemin tellement j'étais sidérer de la solution trouvée.

    <hs>
    Mais, pour l'heure, je me demande vraiment à quoi elle sert cette classe Form, à part pour faire un bindRequest, isValid :l Disons que ce n'est que la RC4.

    Fin bon, sortir l'artillerie lourde pour mener un projet bien structurer et se retrouver à bidouiller des trucs comme cela, sa me lourdes : l
    Et puis si je choisis un framework qui à dépensé autant d’énergie dans sa conception et sa complexitude, ce n'est certainement pas pour bidouiller, je n'ai pas les connaissances nécessaire pour évaluer les impacts de ma bidouille :l
    </hs>



    a+

  9. #9
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Dans ce cas en fait, je serais tente de dire... il te faut un champ personnalise !
    Un champ qui affiche 2 input, ta checkbox et ton textarea, et qui les valide en fonction de tes besoins particuliers.

    Mais le probleme c'est que c'est long a faire pour pas grand chose... C'est un peu le mauvais cote de symfony ca, tout est possible mais on dit pas a quel prix.

  10. #10
    Membre éclairé
    Avatar de djayp
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    295
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 295
    Points : 687
    Points
    687
    Par défaut
    Salut,

    A ce moment là tu pourrais ajouter une variable dans ta classe (avec ses getter/setter), mais sans annotation \ORM. Ainsi elle sera accessible depuis ton code php, mais ne sera pas enregistrée en bdd.

    Avec doctrine il ne faut pas raisonner en base de donnée, mais bien en objet.

    A++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ajout d'une contrainte sur un champ
    Par Djobird dans le forum Langage SQL
    Réponses: 2
    Dernier message: 21/07/2011, 10h14
  2. Optimisation d'une requete sur un champ texte
    Par TARMINE dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/06/2006, 13h41
  3. Select sur une partie d'un champs texte
    Par dl_jarod dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/11/2005, 15h25
  4. [Interbase] Mettre une contrainte sur un champ
    Par mika dans le forum InterBase
    Réponses: 2
    Dernier message: 26/01/2005, 14h04
  5. contrainte sur deux champs d'une table
    Par bdkiller dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 17/09/2004, 18h26

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