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 »

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 « 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
<?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 « 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
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;
    }
}
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
<?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 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
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');
    }
}
?>
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
<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>