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

 PHP Discussion :

symfony formulaire conseil. [1.x]


Sujet :

PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2011
    Messages
    444
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mars 2011
    Messages : 444
    Points : 108
    Points
    108
    Par défaut symfony formulaire conseil.
    Bonjour,

    j'ai 4 module et voila je veux créé un formulaire unique qui comporte tous les champ des 4 module la question est :
    1. Est se que c'est mieux d'utiliser un formulaire imbriqué(malgré le nombre de module que je doit imbriqué)??
    2. ou je prend un module et j'ajouter les champ avec les widget et j'etulise ma propre fonction d'enregistrement ??

    pour coté conception et valideur et d'autre j'ai pas de probléme !!! Merci

  2. #2
    Membre habitué Avatar de Maerlyn31
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 167
    Points
    167
    Par défaut
    Vaste sujet que les formulaires imbriqués ^^

    Pour ma part, je pense qu'avec 4 modules à imbriquer je ferais comme cela :

    1 - définir 4 classes de formulaire, liées chacune au modèle souhaité (si modèle il y a), et ne comportant que les widget/validateurs souhaités sur le formulaire rendu final

    2 - instancier dans l'action d'affichage du formulaire les 4 formulaires précédement créés

    3 - dans le template d'affichage, positionner mes widget et mes erreurs a la mano,

    4 - Dans l'action de réception du formulaire, utiliser les 4 méthodes isValid(), mais par contre faire le save() à la main.

    Je précise que c'est très personnel et peu conventionnel, mais c'est vrai que les embedForm c'est une foutu galère :p ... Si tu utilise bien les 4 isValid() et que tes validateurs sont propres dans chaque formulaire, tu auras en tout cas peu de perte au niveau sécurité

  3. #3
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2011
    Messages
    444
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mars 2011
    Messages : 444
    Points : 108
    Points
    108
    Par défaut
    Bonjour Maerlyn31

    merci pour ta super réponse.mais si c'est possible tu peux me donné un exemple: par exemple 2 module que chaq'une comporte 2 champ juste un simple exemple pour les 4 étape que t'a cité.
    pour m'eclairé plus les idéé.ca va me servire carément

  4. #4
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2011
    Messages
    444
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mars 2011
    Messages : 444
    Points : 108
    Points
    108
    Par défaut
    voila j'ai créé 2 module pour tester :

    module a1 qui comporte les champ : (id,nom_a1)
    module a2 qui comporte les champ : (id,nom_a2)

    dans A1Form :
    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
    class A1Form extends BaseA1Form
    {
      public function configure()
      {
      	    $this->setWidgets(array(
              'nom_a1' => new sfWidgetFormInput(),
          ));
     
     
     
          $this->widgetSchema->setHelp('nom_a1', 'entre 3 and 20 alphanumerics characters');
     
     
          $this->setValidators(array(
         'nom_a1'   => new sfValidatorAnd(
      		array(
    			new sfValidatorString(
    				array('required' => true, 'min_length' => 3, 'max_length' => 10),
    				array(
    					'min_length' => "attention il faut plus.",
    					'max_length' => "attention il faut moins",
                                        'required' => "vvvv",
    				)))),));
    				$this->widgetSchema->setNameFormat('membre[%s]');
      }
     
    }
    et dans A2Form:
    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
    class A2Form extends BaseA2Form
    {
      public function configure()
        {
      	    $this->setWidgets(array(
              'nom_a2' => new sfWidgetFormInput(),
          ));
     
     
     
          $this->widgetSchema->setHelp('nom_a2', 'entre 3 and 20 alphanumerics characters');
     
     
          $this->setValidators(array(
         'nom_a2'   => new sfValidatorAnd(
      		array(
    			new sfValidatorString(
    				array('required' => true, 'min_length' => 3, 'max_length' => 10),
    				array(
    					'min_length' => "attention il faut plus.",
    					'max_length' => "attention il faut moins",
                                        'required' => "vvvv",
    				)))),));
    				$this->widgetSchema->setNameFormat('membre[%s]');
      }
    }
    puis j'ai instancier le formulaire de A2 dans A1(template/_form.php) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
          <tr>
          <?php $formulaire=new  A2Form();  ?>
            <th><?php echo $formulaire['nom_a2']->renderLabel() ?></th>
            <td>
              <?php echo $formulaire['nom_a2']->renderError() ?>
              <?php echo $formulaire['nom_a2'] ?>
                <?php echo $formulaire['nom_a2']->renderHelp() ?>
            </td>
          </tr>
    Mes de formulaire sont bien affiché mais il réste lors de clique sur enregistrer les action j'ai pensé a sa dans actions.class.php du module A1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    protected function processForm(sfWebRequest $request, sfForm $form)
      {
     
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
        $formulaire=new  A2Form();
        if ($form->isValid() && $formulaire->isValid())
        {
          $a1 = $form->save();
          $f=new  A2();
          $f->save();
        }
      }
    Donc est se que c'est commsa ton idéé??et il m'affiche l'erreur suivent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Unexpected extra form field named "nom_a2".

  5. #5
    Membre habitué Avatar de Maerlyn31
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 167
    Points
    167
    Par défaut
    Alors, dans l'ordre :

    D'abord, juste pour être sur qu'on est d'accord, ton formulaire porte sur 2 ou 4 modèles différents.
    Le code des actions/templates qui lui sont relatifs est stocké dans un module, mais qui n'a pas forcément de lien avec ces modèles. C'est du vocabulaire, mais dans Symfony (comme partout d'ailleur) c'est super important, si tu comprend pas bien les notions derrière chaque terme t'es foutus d'avance


    Pour tes deux classes de formulaires elles sont nickel, les validateurs m'ont l'air bien propre donc les entrées seront sécurisées.
    Attention par contre, vu que tu va avoir tes formulaires sur les mêmes pages, il faut que les $this->widgetSchema->setNameFormat() soient différent, sinon dans la réception des paramètres les deux vont se mélanger.

    Ensuite, en terme de module, à mon avis tu dois être en train de travailler sur un module "crud", c'est à dire que tu a créé ton module avec la commande symfony doctrine:generate-module.

    Selon le cas cette commande peut faire gagner du temps, mais bien souvent quand tu veux faire du code personnalisé il est plus simple de partir de 0, avec symfony generate:module (sans doctrine)


    Pour l'action, tu peux faire quelque chose comme :

    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
     
    // Dans actions.class.php
      public function executeIndex(sfWebRequest $request)
      {
     
        // On instancie les deux formulaires (dans l'action, dans les templates c'est interdit ;) ) 
        $this->formulaire1 = new a1Form();
        $this->formulaire2 = new a2Form();
     
        // Si le formulaire a été posté
        if ($request->isMethod('post'))
        {
            $formulaire1 = $request->getParameter('formulaire1');
            $formulaire2 = $request->getParameter('formulaire2');
            $this->formulaire1->bind($formulaire1);
            $this->formulaire2->bind($formulaire2);
            // On utilise les méthodes isValid() afin de contrôler les entrées utilisateurs. Jusque là on utilise les formulaires "à la Symfony"
            if ($this->formulaire1->isValid() && $this->formulaire2->isValid())
            {
     
                // Par contre à partir d'ici, notre enregistrement est trop compliqué pour la méthode save(). On enregistre donc "a la main".
                $a1 = new a1();
                $a1->setNom($formulaire1['nom']);
                $a1->save();
     
                $a2 = new a2();
                $a2->setNom($formulaire2['nom']);
                $a2->save();
            }
        }
      }
    Par "à la main" j'entends en fait que tu te sers directement dans les valeurs $_POST (le getParameter() pioche dedans, mais au final c'est pareil) pour renvoyer le tout à Doctrine.

    Ce code là n'est pas parfait (prévoir des retour d'erreur en cas de problème de validation, là j'ai juste un traitement si c'est ok), et pour deux modèles simples ça n'a pas vraiment de sens, mais pour les formulaires très complexes, qui doivent surtout faire autre chose que d'envoyer des valeurs à Doctrine (par exemple écrire dans un fichier + un peu de Doctrine + un envoi de mail) j'utilise parfois cette méthode

  6. #6
    Expert éminent
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    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
    Points : 8 486
    Points
    8 486
    Par défaut
    Juste pour compléter.

    Ne jamais utiliser les variables $_GET ou $_POST ou autres $_xxx dans des développements sous symfony.

    Toutes les données sont récupérer dans l'action, généralement dans la variable $request. C'est elle qu'il faut interroger avec la méthode ->getParameter().

    Toutes autres méthodes est à proscrire absolument.
    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 !

  7. #7
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2011
    Messages
    444
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mars 2011
    Messages : 444
    Points : 108
    Points
    108
    Par défaut
    Mais avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->widgetSchema->setNameFormat('membre1[%s]');
    la récupération de cette facon s'amarche pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $request->getParameter('champ');
    mais celle ci oui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_POST['membre1']['champ']
    ??

  8. #8
    Membre habitué Avatar de Maerlyn31
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 167
    Points
    167
    Par défaut
    C'est normal

    Pour récupérer la valeur à l'intéreur du paramètre, il te faut faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // Tu récupère tout le formulaire
    $formulaire = $request->getParameter('membre1');
    // Puis à l'intéreur du $formulaire (un array, du coup), tu récupère ton champ
    $champ = $formulaire['champ']
    Et je te confirme absolument la remarque de Michel Rotta : ne JAMAIS utiliser directement les $_POST, $_GET, $_SESSION dans Symfony !

  9. #9
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2011
    Messages
    444
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mars 2011
    Messages : 444
    Points : 108
    Points
    108
    Par défaut
    Merci Maerlyn31 !!!

  10. #10
    Membre habitué Avatar de Maerlyn31
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2011
    Messages : 71
    Points : 167
    Points
    167
    Par défaut
    Ps de soucis

    Si ton problème est réglé, pense au bouton [Résolu] !

  11. #11
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2011
    Messages
    444
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mars 2011
    Messages : 444
    Points : 108
    Points
    108
    Par défaut
    Bonjour j'ai travailler sur ton exemple mais les valideur du formulaire instancier ne sont pas appliqué il prend en charge que les valideur du module ou je suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      public function executeNew(sfWebRequest $request)
      {
        $this->form = new A1Form();
        $formulaire2 = new A2Form();	
      }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
      public function executeCreate(sfWebRequest $request)
      {
        $this->forward404Unless($request->isMethod(sfRequest::POST));
     
         $this->form = new A1Form();
        $this->formulaire2 = new A2Form();
     
        $this->processForm($request,$this->form);
     
        $this->setTemplate('new');
      }
    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
    protected function processForm(sfWebRequest $request, sfForm $form)
      {
    if ($request->isMethod('post'))
        {
            $form = $request->getParameter('membre1');
            $formulaire2 = $request->getParameter('membre2');
     
            $this->form->bind($form);
            $this->formulaire2->bind($formulaire2);
     
            // On utilise les méthodes isValid() afin de contrôler les entrées utilisateurs. Jusque là on utilise les formulaires "à la Symfony"
            if ($this->form->isValid() && $this->formulaire2->isValid())
            {
     
                // Par contre à partir d'ici, notre enregistrement est trop compliqué pour la méthode save(). On enregistre donc "a la main".
               $a1 = new A1();
                $a1->setId('');
     
                $a1->setNomA1($_POST['membre1']['nom_a1']);
                $a1->save();
     
                $a2 = new A2();
                $a2->setId('');
                $a2->setNomA2($_POST['membre2']['nom_a2']);
                $a2->save();
            }}
    et dans template si j'instancie pas une autre fois la class il ne le connait pas bizzar ??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     <?php $formulaire2=new  A2Form();  ?>
     
            <th><?php echo $formulaire2['nom_a2']->renderLabel() ?></th>
            <td>
            <?php echo $formulaire2->renderGlobalErrors() ?>
              <?php echo $formulaire2['nom_a2']->renderError() ?>
              <?php echo $formulaire2['nom_a2'] ?>
                <?php echo $formulaire2['nom_a2']->renderHelp() ?>
    Merci !!!

  12. #12
    Membre régulier
    Homme Profil pro
    Analyse système
    Inscrit en
    Mars 2011
    Messages
    444
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Analyse système

    Informations forums :
    Inscription : Mars 2011
    Messages : 444
    Points : 108
    Points
    108
    Par défaut
    l'erreur vient de l'include j'ai oublie de faire dans newsucces :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php include_partial('form', array('form' => $form, 'formulaire2' => $formulaire2)) ?>

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

Discussions similaires

  1. [2.x] [Symfony]Formulaire cahier de note
    Par jillthe1 dans le forum Symfony
    Réponses: 11
    Dernier message: 18/03/2014, 16h11
  2. [1.x] symfony: formulaire en prod
    Par symfony dans le forum Débuter
    Réponses: 0
    Dernier message: 29/09/2011, 19h54
  3. [1.x] Symfony formulaire multiple type facture
    Par sipap dans le forum Symfony
    Réponses: 5
    Dernier message: 13/09/2011, 23h34
  4. [1.x] symfony formulaire instancier
    Par benhsaien dans le forum Débuter
    Réponses: 1
    Dernier message: 22/06/2011, 12h34

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