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 :

pb insertion BdD avec formulaire + modification data prototype


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2016
    Messages : 22
    Par défaut pb insertion BdD avec formulaire + modification data prototype
    Bonjour et merci d'avance à tous ceux et celles qui prendront la peine de m'aider!

    Pour un projet de cour j'ai dû générer mes entity symfony3 depuis une base de données (et elle est pas tiptop malheureusement..).

    Dans ma BdD j'ai ces 3 tables: "Users" OneToMany "Appeller" ManyToOne "Contact"
    Appeller contient juste deux clés étrangères pour relié un User à tous ses contacts. De ces 3 tables j'ai généré 3 entity: Users, Contact et Appeller:
    Users:

    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
    /**
     * Users
     *
     * @ORM\Table(name="users")
     * @ORM\Entity(repositoryClass="DCB\ApprentissagesBundle\Entity\UsersRepository")
     */
    class Users {
        //comme l'entity classe fait environ 260 lignes j'ai enlevé tous les champs générés depuis la base de données (sauf l'id) pour vous laissé le minimum que vous avez besoin
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer", nullable=false)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;
     
        public function setId($id) {
            $this->id = $id;
        }
     
        public function getId() {
            return $this->id;
        }
     
        /**
         * @ORM\OneToMany(targetEntity="DCB\ApprentissagesBundle\Entity\Contact",mappedBy="contact", cascade={"persist"})
         */
        private $contacts;
     
        public function addContacts($contact) {
            $this->contacts[] = $contact;
        }
     
        public function getContact() {
            return $this->contacts;
        }
     
        public function removeContact($contact) {
            $this->contacts->removeElement($contact);
        }
     
        public function __construct(){
            $this->contacts = new ArrayCollection();
        }
    }


    Contact (~130l)

    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    /**
     * Contact
     *
     * @ORM\Table(name="contact")
     * @ORM\Entity
     */
    class Contact {
     
        /**
         * @var integer
         *
         * @ORM\Column(name="id_contact", type="integer", nullable=false)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $idContact;
     
        public function setIdContact($idContact) {
            $this->idContact = $idContact;
        }
     
        public function getIdContact() {
            return $this->idContact;
        }
     
        /**
         * @var string
         *
         * @ORM\Column(name="nom_contact", type="string", length=25, nullable=true)
         */
        private $nomContact;
     
        public function setNomContact($nomContact) {
            $this->nomContact = $nomContact;
        }
     
        public function getNomContact() {
            return $this->nomContact;
        }
     
        /**
         * @var string
         *
         * @ORM\Column(name="prenom_contact", type="string", length=25, nullable=true)
         */
        private $prenomContact;
     
        public function setPrenomContact($prenomContact) {
            $this->prenomContact = $prenomContact;
        }
     
        public function getPrenomContact() {
            return $this->prenomContact;
        }
     
        /**
         * @var string
         *
         * @ORM\Column(name="adrese_contact", type="string", length=100, nullable=true)
         */
        private $adreseContact;
     
        public function setAdreseContact($adreseContact) {
            $this->adreseContact = $adreseContact;
        }
     
        public function getAdreseContact() {
            return $this->adreseContact;
        }
     
        /**
         * @var string
         *
         * @ORM\Column(name="CP_contact", type="string", length=6, nullable=true)
         */
        private $cpContact;
     
        public function setCpContact($cpContact) {
            $this->cpContact = $cpContact;
        }
     
        public function getCpContact() {
            return $this->cpContact;
        }
     
        /**
         * @var string
         *
         * @ORM\Column(name="ville_contact", type="string", length=25, nullable=true)
         */
        private $villeContact;
     
        public function setVilleContact($villeContact) {
            $this->villeContact = $villeContact;
        }
     
        public function getVilleContact() {
            return $this->villeContact;
        }
     
        /**
         * @var string
         *
         * @ORM\Column(name="telFixe_contact", type="string", length=10, nullable=true)
         */
        private $telfixeContact;
     
        public function setTelfixeContact($telfixeContact) {
            $this->telfixeContact = $telfixeContact;
        }
     
        public function getTelfixeContact() {
            return $this->telfixeContact;
        }
     
        /**
         * @var string
         *
         * @ORM\Column(name="telMobile_contact", type="string", length=10, nullable=true)
         */
        private $telmobileContact;
     
        public function setTelmobileContact($telmobileContact) {
            $this->telmobileContact = $telmobileContact;
        }
     
        public function getTelmobileContact() {
            return $this->telmobileContact;
        }
     
    }


    Appeller

    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
     
    /**
     * Appeller
     *
     * @ORM\Table(name="appeller", indexes={@ORM\Index(name="FK_appeller_id_contact", columns={"id_contact"}), @ORM\Index(name="fk_appeller_users1_idx", columns={"users_id"})})
     * @ORM\Entity(repositoryClass="DCB\ApprentissagesBundle\Entity\AppellerRepository")
     */
    class Appeller {
     
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer", nullable=false)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;
     
        public function setId($id) {
            $this->id = $id;
        }
     
        public function getId() {
            return $this->id;
        }
     
        /**
         * @var \Contact
         *
         * @ORM\ManyToOne(targetEntity="Contact")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="id_contact", referencedColumnName="id_contact")
         * })
         */
        private $contact;
     
        public function setContact($contact) {
            $this->contact = $contact;
        }
     
        public function getContact() {
            return $this->contact;
        }
     
        /**
         * @var \Users
         *
         * @ORM\ManyToOne(targetEntity="Users")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="users_id", referencedColumnName="id")
         * })
         */
        private $users;
     
        public function setUsers($users) {
            $this->users = $users;
        }
     
        public function getUsers() {
            return $this->users;
        }
    }



    Pour créer et insérer un nouveau User et ses contacts dans la BdD j'ai 2 formulaires:
    ContactType:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('nomContact', TextType::class)
                    ->add('prenomContact', TextType::class)
                    ->add('adreseContact', TextType::class)
                    ->add('cpContact', TextType::class)
                    ->add('villeContact', TextType::class)
                    ->add('telfixeContact', TextType::class)
                    ->add('telmobileContact', TextType::class);
        }



    ContactType est utilisé en CollectionType::class dans UsersType:

    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
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('name', TextType::class, array('label' => 'Nom:'))
                    ->add('prenom', TextType::class, array('label' => 'Prénom:'))
                    ->add('role', TextType::class)
                    ->add('email', EmailType::class, array('label' => 'Email:'))
                    ->add('password', PasswordType::class)
                    ->add('createdAt', DateType::class)
                    ->add('updatedAt', DateType::class)
                    ->add('adresse', TextType::class, array('label' => 'Adresse:'))
                    ->add('cp', TextType::class, array('label' => 'Code Postal:'))
                    ->add('ville', TextType::class, array('label' => 'Ville:'))
                    ->add('telephone', TextType::class, array('label' => 'Téléphone:'))
                    ->add('dob', BirthdayType::class, array('label' => 'Date de naissance:'))
                    ->add('contact', CollectionType::class, array(
                                                        'entry_type' => ContactType::class,
                                                        'allow_add' => TRUE,
                                                        'allow_delete' => TRUE
                                                   )
                          )
                    ->add('Enregistrer', SubmitType::class);
        }


    En suivant un cours je suis arrivé a faire s'afficher le form Contact avec possibilité d'en ajouté un et d'en supprimé un (via le script JS du tuto que j'ai un peu modifier).

    Mais j'ai encore 2 problèmes que je n'arrive pas à résoudre (j'ai cherché sur le web quand même ):
    Lors de l'insertion dans la base, seulement le user et le dernier contact saisie est insérer.
    De plus la table Appeller qui fait le lien entre un User et ses Contact n'est pas remplie...

    Je précise
    Je suis débutant sur symfony (1er projet!) quelqu'un pour m'aider??

  2. #2
    Membre très actif Avatar de keitaro_bzh
    Homme Profil pro
    Est-ce intéressant?
    Inscrit en
    Juin 2009
    Messages
    320
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Est-ce intéressant?

    Informations forums :
    Inscription : Juin 2009
    Messages : 320
    Par défaut
    Salut,

    Entre débutant, on va essayer de se dépatouiller

    Peux-tu mettre le code JS que tu as mis ainsi que le controller? Je m'oriente vers ce code pour n'avoir que le dernier contact d'inséré.

    Concernant le remplissage en base de l'entité Appeler, euh, je dis peut-être une connerie grosse comme moi, mais je vois pas comment tu veux que la table soit renseigné puisque dans ton entité user et contact, tu ne fais aucun lien avec appeler.
    Comme il est dit dans le cours (que j'ai fait également), il dit bien à un endroit que ton entité est lié à une autre sans le savoir, c'est symfony qui gère tout... Cela ressemble à ton cas, les deux sont liés à ton entité appeler mais tu n'appelles jamais cette entité (dans le code fourni). Ca vient peut-être de la?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2016
    Messages : 22
    Par défaut
    Hello!
    J'ai modifier une peur le code pour relié Users et Contact à Appeller:
    Users:

    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
    <?php
     
    namespace DCB\ApprentissagesBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
     
    /**
     * Users
     *
     * @ORM\Table(name="users")
     * @ORM\Entity(repositoryClass="DCB\ApprentissagesBundle\Entity\UsersRepository")
     */
    class Users {
     
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer", nullable=false)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;
     
        public function setId($id) {
            $this->id = $id;
        }
     
        public function getId() {
            return $this->id;
        }
     
        //pas mal d'autre lignes
     
        /**
         * @ORM\OneToMany(targetEntity="DCB\ApprentissagesBundle\Entity\Appeller",mappedBy="user", cascade={"persist"})
         */
        private $contacts;
     
        public function addContacts($contact) {
            $this->contacts->add($contact);
        }
     
        public function getContacts() {
            return $this->contacts;
        }
     
        public function removeContacts($contact) {
            $this->contacts->removeElement($contact);
        }
     
        public function __construct(){
            $this->contacts = new ArrayCollection();
        }
    }


    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
    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
    <?php
     
    namespace DCB\ApprentissagesBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
     
    /**
     * Contact
     *
     * @ORM\Table(name="contact")
     * @ORM\Entity
     */
    class Contact {
     
        /**
         * @var integer
         *
         * @ORM\Column(name="id_contact", type="integer", nullable=false)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $idContact;
     
        public function setIdContact($idContact) {
            $this->idContact = $idContact;
        }
     
        public function getIdContact() {
            return $this->idContact;
        }
     
    //pas mal d'autres lignes
     
        /**
         * @ORM\OneToMany(targetEntity="DCB\ApprentissagesBundle\Entity\Appeller",mappedBy="contact", cascade={"persist"})
         */
        private $user;
     
        public function addUser($user) {
            $this->user[] = $user;
        }
     
        public function getUser() {
            return $this->user;
        }
     
        public function removeUser($user) {
            $this->user->removeElement($user);
        }
     
        public function __construct(){
            $this->user = new ArrayCollection();
        }
    }


    Appeller

    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
    <?php
     
    namespace DCB\ApprentissagesBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * Appeller
     *
     * @ORM\Table(name="appeller", indexes={@ORM\Index(name="FK_appeller_id_contact", columns={"id_contact"}), @ORM\Index(name="fk_appeller_users1_idx", columns={"users_id"})})
     * @ORM\Entity(repositoryClass="DCB\ApprentissagesBundle\Entity\AppellerRepository")
     */
    class Appeller {
     
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer", nullable=false)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;
     
        public function setId($id) {
            $this->id = $id;
        }
     
        public function getId() {
            return $this->id;
        }
     
        /**
         * @var \Contact
         *
         * @ORM\ManyToOne(targetEntity="Contact", inversedBy="user")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="id_contact", referencedColumnName="id_contact")
         * })
         */
        private $contact;
     
        public function setContact($contact) {
            $this->contact = $contact;
        }
     
        public function getContact() {
            return $this->contact;
        }
     
        /**
         * @var \Users
         *
         * @ORM\ManyToOne(targetEntity="Users", inversedBy="contacts")
         * @ORM\JoinColumns({
         *   @ORM\JoinColumn(name="users_id", referencedColumnName="id")
         * })
         */
        private $user;
     
        public function setUser($users) {
            $this->user = $users;
        }
     
        public function getUser() {
            return $this->user;
        }
    }


    Voila les codes qui t'intéresse (/!\: l'insertion en BdD ne marche plus. J'ai une erreur maintenant)
    Voila la fonction du UsersController:

    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
        public function addAction(Request $request) {
            $eleve = new Users();
     
            $form = $this->createForm(UsersType::class, $eleve);
            $form->handleRequest($request);
     
     
            if($form->isSubmitted() && $form->isValid()){
                //$eleve = $form->getData();
                //définition des valeurs inchangeable par l'utilisateur
                $eleve->setRole('eleve');
                $eleve->setCreatedAt(new \DateTime());
                $eleve->setUpdatedAt(new \DateTime());
                //insertion en BdD
                $em = $this->getDoctrine()->getManager();
                $em->persist($eleve);
                $em->flush();
     
                //Redirection sur la page de vue d'un eleve
                return $this->redirect(
                        $this->generateUrl('dcb_apprentissages_view_eleve',
                            array('id' => $eleve->getId())
                        )
                );
            }


    Voila la vu twig avec le script script JS. Tu devrais t'en sortir avec les commentaire je pense

    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
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    {% extends "DCBApprentissagesBundle::base.html.twig"%}
    {% block corps %}
        <h3>Ajout d'un élève</h3>
        {{dump(form)}}
        {{ form_start(form, {'attr': {'class': 'formEleve'}}) }}
            {{ form_errors(form) }}
     
            {#Identite eleve#}
            {{ form_row(form.name) }}
            {{ form_row(form.prenom) }}
            {{ form_row(form.dob) }}
     
            {#Information personnelle#}
            {{ form_row(form.email) }}
            {{ form_row(form.telephone) }}
     
            {#Habitation#}
            {{ form_row(form.adresse) }}
            {{ form_row(form.cp) }}
            {{ form_row(form.ville) }}
     
            {#Contact#}
            {#div qui contiendra les formulaire contact générés par le lien#}
            <div id="listContact"></div>
     
            {#div qui contiendra les infos pour créer un formulaire (prototype et n° du prochain formulaire à créer contact générés par le lien#}
            <div id="dataContactType"
                 data-prototype="{{ form_widget(form.contacts.vars.prototype)|e('html_attr') }}"
                 data-index="{{ form.contacts|length }}"
                 >
                {#Lien de création d'un formulaire#}
                <a href="#" id="add_contact">Ajouter un contact</a>
            </div>
     
            {#Secu et envoie#}
            {{ form_widget(form._token) }}
            {{ form_widget(form.Enregistrer, {'attr': {'class':'formSubmitformat'}}) }}
        {{ form_end(form, {'render_rest': false}) }}
     
     
        <h3>Ajout plusieurs élèves</h3>
     
        {#Import de JQuery#}
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
    <script type="text/javascript">
      $(document).ready(function() {
        // récupération du div qui contient le prototype du formulaire
        var $container = $('#dataContactType');
     
        //Ajout de la fonction de création de formulaire au lien #add_contact contenu dans la div récupérée precedemment
        $container.on('click', '#add_contact', function(e){
            e.preventDefault();
            addContacts($container);
            return false;
        });
     
        // Ajoute un premier formulaire automatiquement à l'affichage de la page
        if ($container.data('index') === 0) {
          addContacts($container);
        } else {
          // S'il existe déjà des contacts, on ajoute un lien de suppression pour chacun d'entre eux
          $container.children('div').each(function() {
            addDeleteLink($(this));
          });
        }
     
        // Fonction d'ajout d'un formulaire
        function addContacts($container) {
            //Récuperation du n° du formulaire
            let index = $container.data('index');
     
     
            //!!\\ a adapter suivant ton prototype, inspect la page et tu devrais trouver un gros paté
            // Dans le contenu de l'attribut « data-prototype », on remplace :
            // - le titre par le n° du formulaire
            // - le texte "__name__" qu'il contient par le numéro du champ
            let template = $container.data('prototype')
                .replace('Contact', 'Contact n°' + (index+1)+ ' :')
                .replace('__name__', index)
            ;
     
          // On crée un objet jquery qui contient ce template
          var $newForm = $(template);
     
          // On ajoute au prototype un lien pour pouvoir supprimer le contact
          addDeleteLink($newForm);
     
          // On ajoute le prototype modifié à la fin de la balise qui contient tout les formulaire
          $('div#listContact').append($newForm);
     
          // Enfin, on incrémente le compteur pour que le prochain ajout se fasse avec un autre numéro
          $container.data('index', index+1);
        }
     
        // La fonction qui ajoute un lien de suppression d'une contact
        function addDeleteLink($form) {
          // Lien a ajouter
          var $deleteLink = $('<a href="#" class="btn btn-danger">Supprimer</a>');
     
          // Ajout du lien
          $form.append($deleteLink);
     
          // Ajout du listener sur le clic du lien pour effectivement supprimer le contact
          $deleteLink.click(function(e) {
            $form.remove();
            e.preventDefault();
            return false;
          });
        }
      });
    </script>
    {% endblock %}



    Voilà les modifs que j'ai fait sur les Formulaire (juste les ligne modifiées):
    UsersType:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
                    ->add('contacts', CollectionType::class, array(
                                                        'entry_type' => AppellerType::class,
                                                        'allow_add' => TRUE,
                                                        'allow_delete' => TRUE,
                                                        'by_reference' => FALSE, //force symfony a utilisé les getter et setter de la classe (d'après le tuto)
                                                        'required' => TRUE,
                                                        //'attr' => array('class' => 'listContact')
                                                   )
                          )


    AppellerType

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('contact', ContactType::class, array(
                                                        'attr' => array('class' => 'AppellerContactForm')
                                                   )
                          )
            ;
        }


    Pour contact j'ai juste rajouté des labels pour chaque champs

    Quand je submit le formulaire j'ai cette erreur qui s'affiche:

    An exception occurred while executing 'INSERT INTO appeller (id_contact, users_id) VALUES (?, ?)' with params [19, null]:

    SQLSTATE[23000]: Integrity constraint violation: 1048 Le champ 'users_id' ne peut être vide (null)
    500 Internal Server Error - NotNullConstraintViolationException
    2 linked Exceptions: PDOException » PDOException »


    Je pense que ça vient du fait que dans AppellerType j'ai juste un champ contact, mais pas user.
    Je suppose que je pourrais rajouter la ligne ci-dessous à dans AppellerType et utiliser AppellerType à la place de UsersType.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ->add('user', IntegerType::class)


    Le problème c'est qu'ensuite je vais devoir rajouter la saisie de la classe (en BdD: "Users" OnToMany "Appartenir" ManyToOne "Groupe"

    Du coup je vois pas comment faire...

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Par défaut
    Bonjour,
    j'ai suivi a la fin le probleme.
    L'exception est enfaite tu n'as pas mentionné nullable =true pour la colonne attribut user dans la classe Appeller

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2016
    Messages : 22
    Par défaut
    Bonjour MehrezLabidi

    Merci pour ta réponse, malheureusement la table "Appeller" sert de connexion entre "Users" et "Contacts", du coup les clés étrangères ne peuvent pas être null..

    En cherchant un peu j'ai essayé de passer à une relation ManyToMany entre les entités Users et Contact et en définissant "Appeller" en liaison dans "Users". Comme ça j'ai pas besoin de me servir de l'entité "Appeller".

    sauf qu'évidemment j'ai une erreur xD

    Users:

    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
    90
    <?php
     
    namespace DCB\ApprentissagesBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
     
    /**
     * Users
     *
     * @ORM\Table(name="users")
     * @ORM\Entity(repositoryClass="DCB\ApprentissagesBundle\Entity\UsersRepository")
     */
    class Users {
     
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer", nullable=false)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;
     
        public function setId($id) {
            $this->id = $id;
        }
     
        public function getId() {
            return $this->id;
        }
     
    //Quelques propriétés
     
        /**
         * @var ArrayCollection Contact $contacts
         * Owning Side
         * 
         * @ORM\ManyToMany(targetEntity="DCB\ApprentissagesBundle\Entity\Contact", inversedBy="users", cascade={"persist", "merge"})
         * @ORM\JoinTable(name="Appeller",
         *   joinColumns={@ORM\JoinColumn(name="users_id", referencedColumnName="id")},
         *   inverseJoinColumns={@ORM\JoinColumn(name="id_contact", referencedColumnName="id_contact")}
         * )
         */
        private $contacts;
     
        /**
         * Add Contact
         *
         * @param Contact $contact
         */
        public function addContact(Contact $contact) {
            // Si le contact ne fait pas déjà partie de la collection
            if (!$this->contacts->contains($contact)) {
                $this->contacts->add($contact);
            }
            //$this->user[] = $user;
        }
     
        public function setContacts($contacts)
        {
            if ($contacts instanceof ArrayCollection || is_array($contacts)) {
                foreach ($contacts as $contact) {
                    $this->addUsers($contact);
                }
            } elseif ($contacts instanceof Contact) {
                $this->addUsers($contacts);
            } else {
                throw new Exception("$contacts must be an instance of Contact or ArrayCollection of Contact");
            }
        }
     
        /**
         * Get contacts
         *
         * @return ArrayCollection
         */
        public function getContacts() {
            return $this->contacts;
        }
     
        public function removeContacts($contact) {
            $this->contacts->removeElement($contact);
        }
     
        public function __construct(){
            $this->contacts = new ArrayCollection();
            //$this->groupes = new ArrayCollection();
        }
    }


    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
    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
    90
    <?php
     
    namespace DCB\ApprentissagesBundle\Entity;
     
    use Doctrine\ORM\Mapping as ORM;
    use Doctrine\Common\Collections\ArrayCollection;
     
    /**
     * Contact
     *
     * @ORM\Table(name="contact")
     * @ORM\Entity
     */
    class Contact {
     
        /**
         * @var integer
         *
         * @ORM\Column(name="id_contact", type="integer", nullable=false)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $idContact;
     
        public function setIdContact($idContact) {
            $this->idContact = $idContact;
        }
     
        public function getIdContact() {
            return $this->idContact;
        }   
     
    //beaucoup d'autres attributs de l'entity
     
        /**
         * @var ArrayCollection Users $users
         * 
         * Inverse Side
         * 
         * @ORM\ManyToMany(targetEntity="DCB\ApprentissagesBundle\Entity\Users",mappedBy="contacts", cascade={"persist", "merge"})
         */
        private $users;
     
        /**
         * Add Users
         *
         * @param Users $user
         */
        public function addUsers($user) {
            // Si le user ne fait pas déjà partie de la collection
            if (!$this->users->contains($user)) {
                //et que le user ne contient pas ce contact
                if (!$user->getContacts()->contains($this)) {
                    $user->addContacts($this);  // Lie le Users au contact.
                }
                $this->users->add($user);
            }
            //$this->user[] = $user;
        }
     
        public function setUsers($users)
        {
            if ($users instanceof ArrayCollection || is_array($users)) {
                foreach ($users as $user) {
                    $this->addUsers($user);
                }
            } elseif ($users instanceof Contact) {
                $this->addUsers($users);
            } else {
                throw new Exception("$users must be an instance of Users or ArrayCollection of Users");
            }
        }
     
        /**
         * Get ArrayCollection
         *
         * @return ArrayCollection $users
         */
        public function getUser() {
            return $this->users;
        }
     
        public function removeUser($user) {
            $this->users->removeElement($user);
        }
     
        public function __construct(){
            $this->users = new ArrayCollection();
        }
    }


    dans UsersType:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
                    ->add('contacts', CollectionType::class, array(
                                                        'entry_type' => ContactType::class,
                                                        'allow_add' => TRUE,
                                                        'allow_delete' => TRUE,
                                                        'required' => TRUE,
                                                        'by_reference' => FALSE, //force symfony a utilisé les getter et setter de la classe
                                                   )
                          )


    Quand j'envoie le formulaire sans contact, le user est bien inséré dans la BdD.
    Si je valide le formulaire en ayant saisie un contact ou plus, j'ai cette page qui apparait:
    Cette page ne fonctionne pas

    Impossible de traiter cette demande via localhost à l'heure actuelle.
    HTTP ERROR 500

    Etant donner que 'est une erreur Wamp et pas Symfony, je n'ai pas la barre d'outil de syfony donc impossible de savoir où est le problème..

    Est-ce que je peux faire un autre Formulaire pour lequel il n'y a pas de table dans la base de données et qui contiendrait un champ Users, un champ Groupe, et plusieurs champs Contact??
    Ou bien faire ça dans Symfony n'est pas "correct"??

  6. #6
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2013
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2013
    Messages : 739
    Par défaut
    J'ai pas suivi le problème des le début mais je peux répondre .
    si tu veux créer une formulaire qui n'est pas rattaché a une entité et une table au derrière : la réponse est Oui tu peux
    =>la doc officielle
    pour les exceptions non clairs, si les fichiers logs symfony ne contient rien tu peux consulter les fichiers log d 'apache
    ou de ton serveur web en général
    ou se trouve le fichier log apache , a toi de googler

Discussions similaires

  1. Réponses: 3
    Dernier message: 23/12/2013, 20h39
  2. [1.x] Insertion bdd et formulaires imbriqués
    Par sundo dans le forum Symfony
    Réponses: 1
    Dernier message: 01/06/2012, 12h20
  3. [MySQL] insertion bdd sans formulaire?
    Par ifiii dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 16/01/2011, 17h23
  4. [MySQL] Formulaire PHP avec insertion BDD & Session
    Par DjChat dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 23/05/2008, 13h36

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