Question passer des données du contrôleur à Type symfony2


Si je montre un champ de type "entité" dans mon formulaire, et que je veux filtrer ce type d'entité en fonction d'un argument que je transmets du contrôleur, comment puis-je faire cela?

//PlumeOptionsType.php
public function buildForm(FormBuilder $builder, array $options)
{
    $builder->add('framePlume', 'entity', array(
        'class' => 'DessinPlumeBundle:PhysicalPlume',
        'query_builder' => function(EntityRepository $er) {
                                return $er->createQueryBuilder('pp')
                                    ->where("pp.profile = :profile")
                                    ->orderBy('pp.index', 'ASC')
                                    ->setParameter('profile', ????)
                                ;
                            },

    ));
}

public function getName()
{
    return 'plumeOptions';
}

public function getDefaultOptions(array $options)
{
    return array(
            'data_class'      => 'Dessin\PlumeBundle\Entity\PlumeOptions',
            'csrf_protection' => true,
            'csrf_field_name' => '_token',
            // a unique key to help generate the secret token
            'intention'       => 'plumeOptions_item',
    );
}
}

et à l'intérieur du contrôleur, je crée le formulaire:

i have that argument that i need to pass in my action code:
$profile_id = $this->getRequest()->getSession()->get('profile_id');
...
and then i create my form like this
$form = $this->createForm(new PlumeOptionsType(), $plumeOptions);

le $ plumeOptions est juste une classe à persister. Mais il a une relation individuelle avec une autre classe appelée PhysicalPlume. Maintenant, quand je veux afficher le 'framePlume' dans mon code, je veux afficher une entité PhysicalPlume filtrée.


25
2017-10-18 12:43


origine


Réponses:


Vous pouvez transmettre des paramètres à la classe de formulaire comme suit:

//PlumeOptionsType.php
protected $profile;

public function __construct (Profile $profile)
{
    $this->profile = $profile;
}

Ensuite, utilisez-le dans le query_builder de votre buildForm:

$profile = $this->profile;

$builder->add('framePlume', 'entity', array(
    'class' => 'DessinPlumeBundle:PhysicalPlume',
    'query_builder' => function(EntityRepository $er) use ($profile) {
                            return $er->createQueryBuilder('pp')
                                ->where("pp.profile = :profile")
                                ->orderBy('pp.index', 'ASC')
                                ->setParameter('profile', $profile)
                            ;
                        },

));

Et enfin dans votre contrôleur:

// fetch $profile from DB
$form = $this->createForm(new PlumeOptionsType($profile), $plumeOptions);

40
2017-10-19 08:45



Vous pouvez utiliser $plumeOptions pour tout passer votre argument, mais vous devrez ajouter un getDefaultOptions() dans PlumeOptionsType pour spécifier la valeur par défaut de votre option. Voir par exemple https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Form/Extension/Core/Type/CheckboxType.php pour voir à quoi cette méthode devrait ressembler.


4
2017-10-18 14:04