Отправить значение по умолчанию для формы из контроллера - PullRequest
0 голосов
/ 14 марта 2019

У меня есть цикл, в котором я создаю форму для каждого "Joueur", который у меня есть:

    foreach ($joueurs as $j) 
    {
        $sUniqueFormName = 'Form' . $j->getId(); 
        $oForm = $this->get('form.factory')->createNamed($sUniqueFormName, PlayedType::class, $played);
        $aForms[$sUniqueFormName] = $oForm;            
    }

Я хочу отправить в мою форму этот Entity Joueur и установить его в качестве значения по умолчанию.

Форма:

class PlayedType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('joueur')
            ->add('max')
            ->add('score')
            ->add('points')
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Played::class,
        ]);
    }
}

Здесь атрибут 'joueur' является типом выбора и хочет установить это значение с помощью 'joueur', который я получаю в цикле по умолчанию.

Возможно ли это?

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Передайте массив как 4-й аргумент со значением $ j:

foreach ($joueurs as $j) 
{
    $sUniqueFormName = 'Form' . $j->getId(); 
    $oForm = $this->get('form.factory')->createNamed($sUniqueFormName, PlayedType::class, $played, array('joueur' => $j);
    $aForms[$sUniqueFormName] = $oForm;            
}

Проверьте конструктор для получения дополнительной информации: https://api.symfony.com/3.3/Symfony/Component/Form/FormFactory.html

И восстановите его в PlayedType с помощью $ options и установитеэто как свойство данных

class PlayedType extends AbstractType {
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) {
            $form = $event->getForm();
            $form->add('joueur', null, array(
                 'data' => $event->getData() ?: options['joueur']
             ))
            ->add('max')
            ->add('score')
            ->add('points')
            ;
        });
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Played::class,
            'joueur' => null
        ]);
    } 
}
0 голосов
/ 14 марта 2019

Попробуйте установить joueur непосредственно для объекта played, например, так:

foreach ($joueurs as $j) {
    $sUniqueFormName = 'Form' . $j->getId();
    $played->setJoueur($j);
    $oForm = $this->get('form.factory')->createNamed($sUniqueFormName, PlayedType::class, $played);
    $aForms[$sUniqueFormName] = $oForm;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...