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 :

Peut t'on imbriquer 2 même formulaires [2.x]


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut Peut t'on imbriquer 2 même formulaires
    Bonsoir, je souhaite construire une formulaire qui permet d 'appeler d'autre formulaire.
    Par exemple
    un client a 2 adresses.

    Lorsqu'on se dirige sur la route de création de formulaire on voir des champs à remplir.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    nom
    prenom
    Téléphone
    --------------------
    numéro
    voie
    code postal 
    commune
    -------------------
    ce que je j'aimerais c'est d'ajouter un lien qui permet de faire appraître les
    4 champs supplémentaire (numéros, voie,codepostal,commune)

    Pour le moment j'ai testé un formulaire qui permet d'ajouter un seul champs supplémentaire, mais qu'en ai t' il si l'on souhaite plusieurs champs? dans l'exemple on ajoute plusieurs tag dans un article

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder
                ->add('date')
                ->add('titre')
                ->add('contenu')
                    ->add('auteur')
                    ->add('tags','collection',array('type'=>new TagType,
                                                    'prototype'=>true,
                                                    'allow_add'=>true))
            ;
        }
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    <?php
    // src/Sdz/BlogBundle/Entity/Article.php
     
    namespace Sdz\BlogBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
     
    use Sdz\BlogBundle\Entity\Tag;
     
    /**
     * Sdz\BlogBundle\Entity\Article
     *
     * @ORM\Table()
     * @ORM\Entity(repositoryClass="Sdz\BlogBundle\Entity\ArticleRepository")
     */
    class Article
    {
        /**
         * @var integer $id
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var Datetime $date
         *
         * @ORM\Column(name="date", type="date")
         */
        private $date;
     
        /**
         * @var string $titre
         *
         * @ORM\Column(name="titre", type="string", length=255)
         */
        private $titre;
     
        /**
         * @var text $contenu
         *
         * @ORM\Column(name="contenu", type="text")
         */
        private $contenu;
     
        /**
         * @var string $auteur
         *
         * @ORM\Column(name="auteur", type="string", length=255)
         */
        private $auteur;
     
        /**
         * @ORM\ManyToMany(targetEntity="Sdz\BlogBundle\Entity\Tag")
         */
        private $tags;
     
     
        public function __construct()
        {
            $this->tags = new ArrayCollection();
            $this->date = new \DateTime();
        }
      //...
        /**
         * Add tag
         *
         * @param Tag $tag
         */
        public function addTag(Tag $tag)
        {
            $this->tags[] = $tag;
        }
     
        /**
         * Get tags
         *
         * @return ArrayCollection
         */
        public function getTags()
        {
            return $this->tags;
        }
     
    }
    merci pour les idées ?

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut
    "Manuellement ça fonctionne" mais je n'arrive pas à les imbriquer correctement, à bien défnire
    la classe Type et Handler , comment faut 'il construire ces classes correctement ?

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
       echo "*************TEST***********";
            $contact = new Contact;
     
            $adresse1 = new Adresse;
            $adresse2 = new Adresse;
     
            $contact->setNom('tata');
            $contact->setEmail('tata@tata.fr');
            $contact->setPrenom('jeandd');
     
     
            $adresse1->setCodepostal(96570);
            $adresse1->setCommune('paris');
            $adresse1->setNumero(5555);
            $adresse1->setNomrue('rue');
            $adresse1->setTyperue('dddd');
     
     
            $adresse2->setCodepostal(69500);
            $adresse2->setCommune('bron');
            $adresse2->setNumero(666);
            $adresse2->setNomrue('boulevard');
            $adresse2->setTyperue('eee');
     
    ============répéter X fois
            $adresseN->setCodepostal();
            $adresseN->setCommune();
            $adresseN->setNumero(666);
            $adresseN->setNomrue(');
            $adresseN->setTyperue();
     
     
            $adresse1->setContact($contact);
            $adresse2->setContact($contact);
            $adressen->setContact();
     
            $em = $this->getDoctrine()->getEntityManager();
     
            $em->persist($contact);
            $em->persist($adresse1);
            $em->persist($adresse2);
            $em->persist(n);
     
            $em->flush();
     
     
            echo "ok";

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut
    Que pensez-vous je met la methode formBuilder comme ceci

    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
     
     
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder
           ->add('nom')
           ->add('prenom')
           ->add('email')
            ->add('numeros','collection',array('type'=>new AdresseType,
                                                  'prototype'=>true,
                                                  'allow_add'=>true))
     
            ->add('commune','collection',array('type'=>new AdresseType,
                                                  'prototype'=>true,
                                                  'allow_add'=>true))   
                ;
        }
    sur le type de du contact
    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
     
    class AdresseType extends AbstractType{
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder->add('numeros')->add('commune');
        }
     
        public function getName()
        {
            return 'MyApp_test_adressetype';
        }
     
        public function getDefaultOptions(array $options)
        {
            return array(
                'data_class'=>'Kod\AnnuaireBundle\Entity\Adresse',
            );
        }
    }
    j'ai essayé mai j'ai toujours une erreur sur l'entité Adresse

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut
    je crois que j'ai avance un un petit pas

    j'ai réussi a afficher 2 champs supplémentaires en changeant le AdresseType

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder->add('numeros')->add('voie')->add('commune');
        }
    Lorsque je clique sur ajouter adresse, j'ai bien 3 champs qui apparaissent
    maintenant il faut que j'essaye de trouver comment hydrater correctement l'objet contacte

    j'ai essayer ceci mais il affiche une erreur
    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 AdresseType extends AbstractType{
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder
           ->add('nom')
           ->add('prenom')
           ->add('email')
            ->add('voie','collection',array('type'=>new AdressseType,
                                                  'prototype'=>true,
                                                  'allow_add'=>true))
     
            ->add('commune','collection',array('type'=>new AdresseType,
                                                  'prototype'=>true,
                                                  'allow_add'=>true))   
                ;
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Neither property "communes" nor method "getTechos()" nor method "isTechos()" exists in class "MyApp\TestBundle\Entity\Contact"
    si j'essaye de faire ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            ->add(array('voie','commune'),'collection',array('type'=>new AdressseType,
                                                  'prototype'=>true,
                                                  'allow_add'=>true))
    le form builder n'accepte pas comme paramètre add( un array,..)

    coté handler mais j'en suis pas encore à enregistrer je comptais faire 2 boucle foreach

    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
     
        public function onSuccess(Contact $contact)
        {
            $this->em->persist($contact);
     
            foreach($contact->getNumeros() as $numero)
            {
                $this->em->persist($numero);
            }
     
     
            foreach($contact->getCommunes() as $commune)
            {
                $this->em->persist($commune);
            }
     
     
            $this->em->flush();
        }
    finalement j'ai trouvé, c'était plus simple il fallait juste ajouter un add au formbuilder, et ajouter un attribut dans la classe entité

  5. #5
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2008
    Messages
    1 222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 1 222
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Bonjour keokaz ,
    j'ai u la même problème que vous dans le forum de discutions  "Peut t'on imbriquer 2 même formulaires symfony 2" publie le 20/05/2012, 00h27 , si vous pouvez me donnez plus de précision pour la solution que vous avez trouvez. Merci.

    Réponse pour heithem100

    L'imbriquer 2 formulaire quand il y a un type c'est à dire un ensemble de

    champs il faut faire une boucle foreach avant de faire un flush, c'est ce que j'avais pas compris au début

    ici on a un formulaire de contact et
    adresse (adresse qui contient plusieurs champs , d'ou le foreach)
    après il ne faut pas oublié de mettre sur le formulaire pour alimenter le form builder

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
            ->add('adresses','collection', array(
    		'type'=> new AdresseType(),
            'prototype'=> true,
            'allow_add'=> true))

    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
     
            $this->em->persist($contact);
     
     
            // On persiste tous les tags de l'article.
            foreach($contact->getPhones() as $phone)  
            {
                $this->em->persist($phone);
            }
     
            foreach($contact->getAdresses() as $adresse)  
            {
                $this->em->persist($adresse);
            }
     
            foreach($contact->getMetiers() as $metier)  
            {
     
                //$this->metier = $metier;
                //$this->addMetierContact();
                //var_dump($this->metier);
                $this->em->persist($metier);
     
            }

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/12/2005, 18h07
  2. [MySQL] submit multiples pour le même formulaire
    Par The Wretched dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 14/12/2005, 17h36
  3. peut on changer un bouton de formulaire par une image?
    Par Death83 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 6
    Dernier message: 19/08/2005, 14h55
  4. Réponses: 6
    Dernier message: 05/07/2005, 17h33
  5. [Struts]Appels successifs à un même formulaire
    Par pimousse76 dans le forum Struts 1
    Réponses: 2
    Dernier message: 24/11/2004, 14h13

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