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 :

[symfony 3.4.2] enregistrement des formulaires imbriqués


Sujet :

Symfony PHP

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 125
    Points : 104
    Points
    104
    Par défaut [symfony 3.4.2] enregistrement des formulaires imbriqués
    Bonjour à tous voici ma problématique.
    J'ai 3 entités :
    Livraison = ce sont des livraisons des produits
    Ligne_liv = la ligne représentant chaque produit livré concernant une Livraison donnée
    Produit = produit livré

    L'entité Ligne_liv a une clé composée des ID de Livraison (livId) et Produit (proId).

    Mon but est, sur seul formulaire, en l'occurrence Livraison , je puisse enregistrer non seulement une Livraison mais avec les différentes ligne_liv en utilisant Ajax pour ajouter à volonté les lignes de Livraison.


    Livraison.php (entité de livraison)
    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
    /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @ORM\ManyToOne(targetEntity="ZG\ZagabaBundle\Entity\Exercice", cascade={"persist"})
         * @ORM\JoinColumn(name="Exe_id", referencedColumnName="id", nullable=false)
         */
        private $exeId;
     
        /**
         * @ORM\ManyToOne(targetEntity="ZG\ZagabaBundle\Entity\Commande_externe", cascade={"persist"})
         * @ORM\JoinColumn(name="Com_id", referencedColumnName="id", nullable=false)
         */
        private $comId;
     
    	/**
         * @ORM\OneToMany(targetEntity="ZG\ZagabaBundle\Entity\Ligne_liv", mappedBy="livId", cascade={"persist"})
         */
        private $lignelivraison;
    Produit.php (Entité de produit)
    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
    /**
         * @var int
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @ORM\ManyToOne(targetEntity="ZG\ZagabaBundle\Entity\Categorie_prod", inversedBy="produit", cascade={"persist"})
         * @ORM\JoinColumn(name="Cat_id", referencedColumnName="id", nullable=false)
         */
        private $catId;
        /**
         * @ORM\OneToMany(targetEntity="ZG\ZagabaBundle\Entity\Ligne_liv", mappedBy="proId")
         */
        private $lignelivraison;
    Ligne_liv.php (Entité de ligne livraison)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    /**
         * @ORM\Id @ORM\ManyToOne(targetEntity="ZG\ZagabaBundle\Entity\Produit", inversedBy="lignelivraison", cascade={"persist"})
         * @ORM\JoinColumn(name="Pro_id", referencedColumnName="id", nullable=false)
    	 * 
         */
        private $proId;
     
        /**
         * @ORM\Id @ORM\ManyToOne(targetEntity="ZG\ZagabaBundle\Entity\Livraison", inversedBy="lignelivraison", cascade={"persist"})
         * @ORM\JoinColumn(name="Liv_id", referencedColumnName="id", nullable=false)
    	 * 
         */
        private $livId;
    LivraisonType.php (formulaire de livraison)
    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
    /**
         * {@inheritdoc}
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
    			->add('dateLiv', DateType::class)
    			->add('exeId', EntityType::class, array(
                        'class' => 'ZGZagabaBundle:Exercice',
                        'choice_label' => 'id',
                        'placeholder' => 'Sélectionnez un Exercice',
                    ))
    			->add('comId', EntityType::class, array(
                        'class' => 'ZGZagabaBundle:Commande_externe',
                        'choice_label' => 'num_cmd',
                        'placeholder' => 'Sélectionnez une Commande',
                    ))
    			->add('lignelivraison', CollectionType::class, array(
    				'entry_type'   => Ligne_livType::class,
    				'allow_add'    => true,
    				'allow_delete' => true
    			  ))
    			//->add('ligliv', Ligne_livType::class)
    			->add('enregistrer', SubmitType::class)
    			->add('annuler', ResetType::class);;
        }
    Ligne_livType.php (formulaire de ligne livraison)

    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
    /**
         * {@inheritdoc}
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder
    			->add('qte', IntegerType::class)
    			->add('proId', EntityType::class, array(
                        'class' => 'ZGZagabaBundle:Produit',
                        'choice_label' => 'nom',
                        'placeholder' => 'Sélectionnez un Produit',
                    ))
    			->add('livId', EntityType::class, array(
                        'class' => 'ZGZagabaBundle:Livraison',
    					'choice_label' => 'id',
                        'placeholder' => 'Sélectionnez un Produit',
                    ));
        }
    Controleur ( fonction qui permet d'ajouter la Livraison)
    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
    public function livAddAction(Request $request)
        {
    		$livraison = new Livraison;
    		$form = $this->get('form.factory')->create(LivraisonType::class, $livraison);
    		if ($request->isMethod('POST') && $form->handleRequest($request)->isValid()) 
    		{
    			$em = $this->getDoctrine()->getManager();
    			$em->persist($livraison);
    			$em->flush();
     
    			$request->getSession()->getFlashBag()->add('notice', 'Livraison bien enregistrée.');
     
    			return $this->redirectToRoute('liv_list');
    		}
    		return $this->render('ZGZagabaBundle:Template:livAdd.html.twig', array(
    			'form' => $form->createView()
    			));
        }
    Je veux que:
    - l'ID de Livraison dans l'entité Ligne_liv ne soit pas affiché et sélectionné par l'utilisateur, mais plutôt récupérer automatique dans Livraison
    - L'ID de produit soit récupéré en fonction du choix de l'utilisateur
    quand j'essai d'enregistrer, j'ai cette erreur:
    The controller for URI "/" is not callable. Expected method "prodFindAction" on class "ZG\ZagabaBundle\Controller\MainController", did you mean "livFindAction", "prodAddAction", "prodDelAction", "prodFinfAction", "prodListAction", "prodUpAction"?

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 125
    Points : 104
    Points
    104
    Par défaut
    J'ai pu résoudre l'erreur liée à l'URL en ajoutant des liens sur tous les paramètres path du fichier routing.yml
    et j'ai le rendu final Nom : Capture1.PNG
Affichages : 708
Taille : 20,8 Ko
    ce qui me reste à faire maintenant c'est que l'ID de Livraison dans l'entité Ligne_liv ne soit pas affiché et sélectionné par l'utilisateur, mais plutôt récupérer automatique dans Livraison

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2004
    Messages
    803
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 803
    Points : 356
    Points
    356
    Par défaut
    Bonjour,

    Conceptuellement parlant, j'ai beaucoup de mal avec ton entité "Ligne_liv" qui, selon moi, ne devrait pas exister.

    En effet, entre "Produit" et "Livraison", tu as une relation OneToMany. Donc, dans ton entité "Produit", tu devrais retrouver un attribut "livraisons" de type ArrayCollection.

    Tu devais donc avoir un formulaire qui te permets d'encoder un produit, un autre qui te permets d'encoder une ou plusieurs livraisons pour un produit donné et, si tu le désires, une vue qui t'affiche toutes les livraisons pour un produit donné (avec la possibilité éventuelle d'en ajouter en faisant appel au formulaire précédent).

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 125
    Points : 104
    Points
    104
    Par défaut
    voila mes tables pour mieux exprimer les relations entre Livraison et Produit.
    Nom : Capture3.PNG
Affichages : 610
Taille : 55,4 Ko
    Il 'a pas de relation directe entre Livraison et Produit. Dans ma conception on une livraison concerné un ensemble de produit et non un seul produit, d'où la classe d'association Ligne_liv qui prend la quantité d'une produit donné.

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    125
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 125
    Points : 104
    Points
    104
    Par défaut
    Finalement j'ai pu résoudre mon problème et l'enregistrement s'effectue normalement. Voila les modifications que j'ai eu a effectuer:

    - Dans ma classe Livraison.php j'ai changé le constructeur et la fonction addLignelivraison()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public function __construct()
    {
            // définir $lignelivraison comme une collection et non comme une entité Ligne_liv comme je l'avais fait
    	$this->lignelivraison = new ArrayCollection();
    	$this->dateSync = new \Datetime();
    	$this->etatSync = true;
    	$this->supp = false;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public function addLignelivraison(\ZG\ZagabaBundle\Entity\Ligne_liv $lignelivraison)
    {
            $this->lignelivraison[] = $lignelivraison;
            // Ne pas oublier surtout cette ligne qui permet de persister la collection avec l'ID de livraison
    	$lignelivraison->setLivId($this);
     
            return $this;
    }

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/03/2016, 23h10
  2. [2.x] Masquer des formulaires imbriqués
    Par Manumic dans le forum Symfony
    Réponses: 3
    Dernier message: 06/01/2016, 18h27
  3. [2.x] [Symfony 2.6] Persister des formulaires imbriqués
    Par Kevfou dans le forum Symfony
    Réponses: 27
    Dernier message: 18/05/2015, 21h07
  4. [2.x] [Form] Personnalisation des formulaires imbriqués
    Par FadeToBlack dans le forum Symfony
    Réponses: 10
    Dernier message: 20/03/2013, 17h55
  5. renversement des enregistrements sous formulaire
    Par sebos21 dans le forum Access
    Réponses: 2
    Dernier message: 25/05/2006, 10h48

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