Bonjour,

Je viens ici pour exposer mon problème pour avoir votre avis car certaines personnes me disent que ce n'est pas possible.

donc voilà je suis en train de faire un formulaire pour que le joueur puisse choisit un monstre qui est lié à la ville où se trouve le joueur, j'ai donc fait ceci:

TownController.php

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
/**
    * @Security("has_role('ROLE_USER_WITH_CHARACTER') or has_role('ROLE_USER_MODERATOR') or has_role('ROLE_USER_ADMINISTRATOR')")
    */
    public function dungeonAction(Request $request)
    {
        $town = $this->getUser()->getCharacter()->getTown();
 
        $form = $this->get('form.factory')->create(TownMonsterType::class, $town);
        if ($request->isMethod('POST'))
        {
            $form->handleRequest($request);
            if ($form->isValid())
            {
                $em = $this->getDoctrine()->getManager();
                $em->persist($character);
                $em->flush();
                return $this->redirectToRoute('car_caranille_town_dungeon');
            }
        }
        return $this->render('CARCaranilleBundle:Town:Dungeon.html.twig', array('form' => $form->createView()));
    }
TownMonsterType.php

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
<?php
namespace CAR\CaranilleBundle\Form;
 
use CAR\CaranilleBundle\Repository\MonsterRepository;
 
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
 
class TownMonsterType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $town = $builder->getData()->getID();
 
        $builder
        ->add('monster', EntityType::class, array(
        'class'        => 'CARCaranilleBundle:Monster',
        'label' => 'Monstre: ',
        'choice_label' => 'name',
        'multiple'     => false,
        'query_builder' => function(MonsterRepository $repository) use($town)
        {
            return $repository->getMonsterListBuilder($town);
        }))
        ->add('save', SubmitType::class);
    }
 
    /**
     * {@inheritdoc}
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'CAR\CaranilleBundle\Entity\Town'
        ));
    }
 
    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'car_caranillebundle_town';
    }
}
MonsterRepository.php

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
<?php
 
namespace CAR\CaranilleBundle\Repository;
 
/**
 * MonsterRepository
 *
 * This class was generated by the Doctrine ORM. Add your own custom
 * repository methods below.
 */
class MonsterRepository extends \Doctrine\ORM\EntityRepository
{
    public function getMonsterListBuilder($town)
    {
        return $this
        ->createQueryBuilder('c')
        ->where('c.town = :town')
        ->setParameter('town', $town);
    }
}
Pourtant dans l'entité Town il y a une liaison ManyToMany vers Monster de façon bidirectionnelle

Town.php

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
<?php
namespace CAR\CaranilleBundle\Entity;
 
use Doctrine\ORM\Mapping as ORM;
 
/**
 * Town
 *
 * @ORM\Table(name="caranille_town")
 * @ORM\Entity(repositoryClass="CAR\CaranilleBundle\Repository\TownRepository")
 */
 
class Town
{
    /**
     * @var int
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;
 
    /**
    * @ORM\ManyToMany(targetEntity="CAR\CaranilleBundle\Entity\Monster", mappedBy="town"))
    */
    private $monster;
...
Sauf que cela ne fonctionne pas car il me dit:

[Semantical Error] line 0, col 59 near 'town = :town': Error: Invalid PathExpression. StateFieldPathExpression or SingleValuedAssociationField expected.
De plus je penses que envoyer l'id de la ville dans un query_builder est un peu moche car si je me suis embêté à faire une relation town <= > monster c'est bien pour l'utiliser sans devoir faire de requête ^^

Donc comment faire en sorte que le menu déroulant affiche bien les monstres lié à cette ville ?

Cordialement,