从控制器发送默认值到表单

时间:2019-03-14 12:29:46

标签: forms symfony

我有一个循环,其中为我拥有的每个“ Joueur”创建一个表单:

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

我想将此实体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 个答案:

答案 0 :(得分:1)

使用$ j值将数组作为第四个arg传递:

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

并通过$ options在PlayedType中恢复它并将其设置为数据属性

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
        ]);
    } 
}

答案 1 :(得分:0)

例如,尝试直接在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;
}