Bonjour,

J'ai un formulaire de création d'une annonce qui contient un sous-formulaire embarqué (véhicule) qui lui-même à plusieurs champs de type "entité".

Mon problème est que le formulaire n'est pas soumis lorsqu'on appuie sur le bouton "Submit" et aucune erreur n'est affichée.

Voici la fonction appelée dans le controller :

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
    /**
     *  @Route("/road_trip/newAdvert", name="road_trip_createAdvert")
     *  @Route("/road_trip/{id}/editAdvert", name="road_trip_editAdvert")
     */
 
    public function advertForm(Advert $advert = null, Request $request, ObjectManager $manager){
 
        if (!$advert) {
            $advert = new Advert();
            $vehicle = new Vehicle();
 
            $vehicle->setAdvert($advert);
            $advert->setVehicle($vehicle);
        }
 
        $form = $this->createForm(AdvertType::class, $advert);
        $form->handleRequest($request);
 
        if ($form->isSubmitted()) {                          
            return new Response("La marque a été supprimée");
        }
 
        return $this->render('road_trip/createAdvert.html.twig', ['formAdvert' => $form->createView(), 'editMode' => $advert->getId() !== null]);        
    }
Le formulaire de l'annonce :

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
<?php
 
namespace App\Form;
 
use App\Entity\Advert;
use App\Form\VehicleType;
//use App\Form\PhotoType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
 
class AdvertType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('description', TextareaType::class, array('data' => 'Veuillez donner une description du véhicule',))
            ->add('vehicle', VehicleType::class)
        ;
    }
 
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Advert::class,
        ]);
    }
}
Le sous-formulaire du véhicule :

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
<?php
 
namespace App\Form;
 
use App\Entity\Vehicle;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\DateType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
 
class VehicleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('manufactureDate', DateType::class, array('widget' => 'single_text', 'html5' => false, 'attr' => ['class' => 'js-datepicker'],))        
            ->add('numberBeds', ChoiceType::class, array('choices'  => array('1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '6' => 6, '7' => 7, '8' => 8, '9' => 9, '10' => 10), 'placeholder' => 'Veuillez choisir le nombre de couchages du véhicule'))
            ->add('sort', EntityType::class, array('class' => 'App\Entity\Sort', 'choice_label' => 'sort','placeholder' => 'Veuillez choisir un type de véhicule'))
            ->add('fuel', EntityType::class, array('class' => 'App\Entity\Fuel', 'choice_label' => 'fuel','placeholder' => 'Veuillez choisir le carburant du véhicule'))
            ->add('mark', EntityType::class, array('class' => 'App\Entity\Mark', 'choice_label' => 'mark','placeholder' => 'Veuillez choisir la marque du véhicule'))
        ;
    }
 
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Vehicle::class,
        ]);
    }
}
Et enfin, voici le template du formulaire de création de l'annonce :

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
{% extends "base.html.twig" %}
 
{% form_theme formAdvert 'bootstrap_4_layout.html.twig' %}
 
{% block stylesheets %} 
     {{ parent () }} 
     <link rel = "stylesheet" href = "//cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.6.0/css/bootstrap-datepicker.css"> 
 {% endblock %}
 
{% block body %}
 
    {% if editMode %}
 
        <h1>Modification de votre annonce</h1>
 
    {% else %}
 
        <h1>Création de votre annonce</h1>
 
    {% endif %}
 
    {{ form_start(formAdvert) }}
    {{ form_errors(formAdvert) }}
 
    <div>
        {{ form_label(formAdvert.description, 'Description', {'label_attr': {'class': 'foo'}}) }}
        {{ form_errors(formAdvert.description) }}
        {{ form_widget(formAdvert.description) }}
 
        {{ form_label(formAdvert.vehicle.manufactureDate, 'Date de construction du véhicule', {'label_attr': {'class': 'foo'}}) }}
        {{ form_errors(formAdvert.vehicle.manufactureDate) }}
        {{ form_widget(formAdvert.vehicle.manufactureDate) }}
 
        {{ form_label(formAdvert.vehicle.mark, 'Marque', {'label_attr': {'class': 'foo'}}) }}
        {{ form_errors(formAdvert.vehicle.mark) }}
        {{ form_widget(formAdvert.vehicle.mark) }}
 
        {{ form_label(formAdvert.vehicle.fuel, 'Carburant', {'label_attr': {'class': 'foo'}}) }}
        {{ form_errors(formAdvert.vehicle.fuel) }}
        {{ form_widget(formAdvert.vehicle.fuel) }}
 
        {{ form_label(formAdvert.vehicle.sort, 'Type', {'label_attr': {'class': 'foo'}}) }}
        {{ form_errors(formAdvert.vehicle.sort) }}
        {{ form_widget(formAdvert.vehicle.sort) }}
 
        {{ form_label(formAdvert.vehicle.numberBeds, 'Nombre de couchages', {'label_attr': {'class': 'foo'}}) }}
        {{ form_errors(formAdvert.vehicle.numberBeds) }}
        {{ form_widget(formAdvert.vehicle.numberBeds) }}
    </div>
 
    {{ form_end(formAdvert) }}
 
    <button type="submit" class="btn btn-success">
 
        {% if editMode %}
 
            Enregistrer les modifications
 
        {% else %}
 
            Ajouter l'annonce
 
        {% endif %}
 
    </button>
 
    {% block javascripts %}
        {{ parent() }}
        {{ encore_entry_script_tags('createAdvert') }}
        <!-- <script src = "//cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.6.0/js/bootstrap-datepicker.min.js" ></script > -->
        <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/bootstrap-datepicker/1.3.0/js/bootstrap-datepicker.js"></script>
    {% endblock %}
 
{% endblock body %}
Quelqu'un aurait une idée?

Merci d'avance pour votre aide.