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"?