Bonjour,
J’ai un sérieux problème de compréhension sur les formulaires imbriqués et/ou doctrine.
En gros, j’ai :
- Une classe categories qui liste l’intégralité des catégories de mon site
- Une classe wantads qui permet de créer un texte d’annoncé (lié à une et une seule catégorie)
Mon objectif est d’afficher un formulaire avec ces toutes les informations du wantads + la liste des categories. L’internaute remplie le formulaire, sélection une catégorie et op tout s’inscrit en base.
Mon problème est sur ce dernier point, le message d’erreur est :
“Catchable Fatal Error: Object of class Acme\WantadsBundle\Entity\Categories could not be converted to string in C:\developpement\sfprojects\Symfony\vendor\doctrine\dbal\lib\Doctrine\DBAL\Statement.php line 103”
Merci d’avance pour votre aide ;-)
Ci-dessous les différents fichiers (simplifiés)
Classe « categories »
Classe « CategoriesType »
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 <?php namespace Acme\WantadsBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * Categories * * @ORM\Table(name="categories") * @ORM\Entity */ class Categories { /** * @var integer * * @ORM\Column(name="categories_id", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $categoriesId; /** * @var string * * @ORM\Column(name="categories_name", type="string", length=50, nullable=false) */ private $categoriesName; /** * @var integer * * @ORM\Column(name="parents_id", type="integer", nullable=false) */ private $parentsId; /** * Constructor */ public function __construct() { $this->idAttributes = new \Doctrine\Common\Collections\ArrayCollection(); } /** * Get categoriesId * * @return integer */ public function getCategoriesId() { return $this->categoriesId; } /** * Set categoriesName * * @param string $categoriesName * @return Categories */ public function setCategoriesName($categoriesName) { $this->categoriesName = $categoriesName; return $this; } /** * Get categoriesName * * @return string */ public function getCategoriesName() { return $this->categoriesName; } /** * Set parentsId * * @param integer $parentsId * @return Categories */ public function setParentsId($parentsId) { $this->parentsId = $parentsId; return $this; } /** * Get parentsId * * @return integer */ public function getParentsId() { return $this->parentsId; } }
Classe « products »
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 Acme\WantadsBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; use Acme\WantadsBundle\Form\Type\WantAdsType; use Acme\WantadsBundle\Entity\WantAds; use Acme\WantadsBundle\Entity\Categories; class CategoriesType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('CategoriesName', 'entity', array ( 'class' =>'AcmeWantadsBundle:Categories', 'property' => 'categoriesname')); } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Acme\WantadsBundle\Entity\Categories' )); } public function getName() { return 'Categories'; } }
Classe « Productstype » :
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 <?php namespace Acme\WantadsBundle\Entity; use Doctrine\ORM\Mapping as ORM; /** * WantAds * * @ORM\Table(name="want_ads") * @ORM\Entity */ class WantAds { /** * @var integer * * @ORM\Column(name="id_ads", type="integer", nullable=false) * @ORM\Id * @ORM\GeneratedValue(strategy="IDENTITY") */ private $idAds; /** * @var string * * @ORM\Column(name="title_ads", type="string", length=90, nullable=false) */ private $titleAds; /** * @var \Categories * * @ORM\ManyToOne(targetEntity="Categories") * @ORM\JoinColumns({ * @ORM\JoinColumn(name="categories_id", referencedColumnName="categories_id") * }) */ private $categories; /** * Get idAds * * @return integer */ public function getIdAds() { return $this->idAds; } /** * Set titleAds * * @param string $titleAds * @return WantAds */ public function setTitleAds($titleAds) { $this->titleAds = $titleAds; return $this; } /** * Get titleAds * * @return string */ public function getTitleAds() { return $this->titleAds; } /** * Set categories * * @param \Acme\WantadsBundle\Entity\Categories $categories * @return WantAds */ public function setCategories(\Acme\WantadsBundle\Entity\Categories $categories = null) { $this->categories = $categories; return $this; } /** * Get categories * * @return \Acme\WantadsBundle\Entity\Categories */ public function getCategories() { return $this->categories; } }
Le controler :
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 <?php namespace Acme\WantadsBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolverInterface; use Acme\WantadsBundle\Form\Type\WantAdsType; use Acme\WantadsBundle\Entity\WantAds; class WantAdsType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('TitleAds') ->add('Categories', new CategoriesType()); } public function setDefaultOptions(OptionsResolverInterface $resolver) { $resolver->setDefaults(array( 'data_class' => 'Acme\WantadsBundle\Entity\WantAds', 'cascade_validation' => true )); } public function getName() { return 'WantAds'; } }
Le new.html.twig
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 <?php namespace Acme\WantadsBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Acme\WantadsBundle\Form\Type\WantAdsType; use Acme\WantadsBundle\Form\Type\CategoriesType; use Acme\WantadsBundle\Entity\WantAds; use Acme\WantadsBundle\Entity\Categories; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; class WantadsController extends Controller { public function addAction() { $request = $this->get('request'); // On récupère l'objet request via le service container $wantads = new WantAds('');// On créé notre objet WantAds vierge $form = $this->createForm(new WantAdsType(), $wantads);// On bind l'objet WantAds à notre formulaire WantAdsType if ($request->isMethod('POST')) { $form->bind($request); //on test si le formulaire est valide par rapport aux regles de gestion des champs if ($form->isValid()) { //enregistrement du wantads en base $em = $this->getDoctrine()->getManager(); $em->persist($wantads); $em->persist($wantads->getCategories()); $em->flush(); return $this->render('AcmeWantadsBundle:Wantads:success.html.twig'); } else{ return $this->render('AcmeWantadsBundle:Wantads:error.html.twig'); } } else{ return $this->render('AcmeWantadsBundle:Wantads:new.html.twig', array('form' => $form->createView(),)); } return $this->render('AcmeWantadsBundle:Wantads:new.html.twig', array( 'form' => $form->createView(), )); } public function successAction() { return $this->render('AcmeWantadsBundle:Wantads:success.html.twig'); } public function errorAction() { return $this->render('AcmeWantadsBundle:Wantads:error.html.twig'); } } ?>
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 <form action="{{ path('wantads_add') }}" method="post" {{ form_enctype(form) }}> {{ form_errors(form) }} <div> {{ form_label(form.Categories, 'Catégorie de publication : ') }} {{ form_errors(form.Categories) }} {{ form_widget(form.Categories) }} </div> <div> {{ form_label(form.TitleAds, 'Titre de l annonce : ') }} {{ form_errors(form.TitleAds) }} {{ form_widget(form.TitleAds) }} </div> <div> {{ form_label(form.TxtAds, 'Texte de l annonce : ') }} {{ form_errors(form.TxtAds) }} {{ form_widget(form.TxtAds) }} </div> {{ form_rest(form) }} <input type="submit" /> </form>
Partager