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] Un formulaire particulier : méthode ?


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Par défaut [Form] Un formulaire particulier : méthode ?
    Bonjour,

    Pour que mon entité User soit valide, j'ai besoin que soit validé un certain nombre de critères (stocké dans l'entité Critere).

    Le formulaire que j'ai creer directement dans ma vue affiche la liste de critères avec checkbox oui/non :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    {% for critere in criteres %}
                    <tr><td>            
                        {{ critere.nom }}
                    </td><td>               
                        <label class="radio">
                            <input type="radio" name="{{critere.id}}" id="optionsRadios1" value="non" checked>
                            non
                        </label>
                        <label class="radio">
                            <input type="radio" name="{{critere.id}}" id="optionsRadios2" value="oui">
                            oui
                        </label>
                    </td></tr>
    {% endfor %}
    Pour que l'User puisse être créer, il faut que toutes les checkbox soient à 'oui'. Pour cela, j'ai créé dans ma classe User, un attribut $allCritere qui doit être à 'true' pour être valide.

    Je veux donc transmettre à cet attribut la valeur 'true' si l'ensemble des checkbox ont la valeur 'oui'.

    Dans le controleur ca me donne ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    $validateur = 'true';
    foreach ($criteres as $critere) {
                   if ($request->request->get($critere->getId()) == "non"){
                       $validateur = false;
                   }
    }
    $user->setAllCritere($validateur); // si le validateur = false, mon entité User ne sera pas valide
    Je souhaiterais que cette vérification ne se fasse pas dans le controleur. Mais en amont : y'a t'il une méthode idéale pour transmettre les valeurs des checkbox à mon attribut $allCritere, sans passer par le controleur ? Javascript ? Formbuilder (creer un champ comprenant l'ensemble des sous-champs checkbox : j'ai essayé, mais je crois que ça me dépasse...) ?

    J'espère que mes explications ne sont pas trop confuses.
    Merci d'avance pour vos conseils.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Pourquoi ne pas tenter cela:
    • mettre des champs hidden à raison d'un par checkbox
    • Remplir chaque champs à la sélection
    • et grâce à une validation inline ne valider le formulaire que si ces champs ont la bonne valeur

  3. #3
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Que l'on soit bien clair, quand tu dis que tu ne veux pas que la validation se fasse dans le contrôleur, tu veux dire "pas dans le fichier du controller". Parce que sinon ça revient à dire : "pas coté serveur" et là il y a un gros problème de sécurité.
    La validation coté client sans validation serveur derrière viole à elle seule toutes les bonnes pratiques existantes en matière de sécurité, séparation des couches etc. N'ayons pas peur des mots : c'est de la merde en boite.

    Partons du principe que tu ne veux juste pas encombrer ton contrôleur d'une vérification lourde métier.

    Utilise les méthodes de Callback qui sont faites pour définir tes propres méthodes de validation. Les callbacks sont appelés en même temps que les autres méthodes de validation (lorsque tu fais appel à la méthode isValid()).

    Tu peux alors retourner toi même des erreurs dans ton formulaire en fonction des attributs de ton objet sans être obligé de rajouter quoique ce soit. Qui plus est, tu n'auras plus besoin de ton attribut $allCritere.

    Jète un oeil à ça je pense que toutes les réponses que tu attends se trouvent ici : http://symfony.com/doc/2.0/reference.../Callback.html (attention à la version certaines choses changent si tu te trouves en 2.0 ou 2.1)

    ++

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Par défaut
    @Nico_F
    Oui, je parlais de mon fichier controller, plus précisément dans ma méthode RegisterAction.
    Ce n'est pas uniquement pour ne pas l'encombrer mais pour pouvoir passer cette validation comme première étape d'une validation multistep à l'aide du CraueFormFlowBundle :
    la validation de cette première étape ressemble à celle du "cochez la case si vous avez bien lu les conditions d'utilisation", sauf que dans mon cas, il y a x cases à cocher.
    Tu peux alors retourner toi même des erreurs dans ton formulaire en fonction des attributs de ton objet sans être obligé de rajouter quoique ce soit. Qui plus est, tu n'auras plus besoin de ton attribut $allCritere.
    Justement, je n'ai pas d'attribut en relation avec les checkbox et je voudrais m'en passer d'autant que mon nombre de checkbox peut varier.
    Concraitement, l'idéal serait que je construise un formulaire avec un "champ spécial" pouvant contenir toutes mes checkbox quel que soit leur nombre. La valeur renvoyé par ce champ serait un tableau $allCritere, attribut de ma classe User, sur lequel je puisse faire un Callback.
    Mais il y a probablement plus simple...

  5. #5
    Membre Expert Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Justement, je n'ai pas d'attribut en relation avec les checkbox et je voudrais m'en passer d'autant que mon nombre de checkbox peut varier.
    Tu veux dire que ces checkboxes ne sont reliées à aucun champs de la base : ce sont des attributs de ta classe mais non mappés ?
    Ou ce ne sont même pas des attributs de ta classe ?

    Dans le premier cas ce n'est pas un souci dans la mesure ou tu peux gérer des champs non mappés : tu récupères leur valeur sans problème et tu en fais ce que tu veux comme s'il s'agissait de n'importe quel autre champ.

    Dans le second tu essayes de faire quelque chose d'assez bizarre : une sorte de formulaire mappé sur une classe, en y ajoutant des éléments qui ne correspondent pas à des attributs de cette classe. Je ne vois pas bien comment tu peux gérer ça. Il est possible de faire des formulaires avec une classe, des formulaires sans classe, mais un mélange des deux me paraît plus compliqué car dans un cas ou a une classe et dans l'autre un tableau.

    Tu devrais soit avoir un champs pour chaque cas de checkbox, que tu ne mapperais pas mais que tu pourrais contrôler aisément (si tu n'en as que 5 ou 6 différents ce n'est pas excessivement gênant : ça l'est d'avantage si tu en as 40), ou bien alors embarquer une collection d'un formulaire (ce serait ça ton "champ spécial") qui n'aurait qu'une checkbox et qui se baserait sur une classe custom: j'aime moins cette solution mais c'est toujours mieux qu'une validation en javascript. Et puis ça t'évite d'avoir à surcharger ta classe avec des attributs que tu n'utiliseras pas.

    Pour la validation, je reste sur les méthodes de callback.

    ++

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Par défaut
    ce ne sont même pas des attributs de ta classe ?
    Effectivement, je me retrouve dans ce cas bizarre.
    Ce formulaire sert simplement à s'assurer que le recruteur s'est bien assuré que tous les critères d'inclusion dans l'étude sont respectés. Aujourd'hui, je ne connais pas tous ces critères. Comme leur nombre nombre va varier avec l'avancée de l'étude, je ne veux pas en faire des attributs de ma classe.
    Je m'apperçois en effet que la difficulté est trop grande pour mon niveau. Cette solution que tu proposes :
    embarquer une collection d'un formulaire (ce serait ça ton "champ spécial") qui n'aurait qu'une checkbox et qui se baserait sur une classe custom
    est une bonne idée malgré le fait qu'elle te plaise moins. Je récupère cette collection dans mon attribut $allCritere, et je fais un callBack dessus qui validerait l'objet si l'ensemble des cases est coché.
    Je trouve que c'est un bon compromis.
    Un grand merci pour ton aide, Nico_F.
    ++

Discussions similaires

  1. imprimer sous forme de formulaire
    Par fayoub dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 15/08/2006, 21h55
  2. Réponses: 3
    Dernier message: 09/08/2006, 08h25
  3. mise en forme de formulaire
    Par tojiji dans le forum Access
    Réponses: 2
    Dernier message: 25/07/2006, 17h29
  4. Réponses: 11
    Dernier message: 27/06/2006, 15h05
  5. Forme d'appel de méthode réservé méthodes de classe
    Par Chicobrasil dans le forum Langage
    Réponses: 16
    Dernier message: 03/01/2006, 17h43

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