Symfony 3.4 - POST_SUBMIT 事件的预填充字段

Symfony3.4 - Pre filled field on POST_SUBMIT Event

我有一个包含联系人列表的表格。我希望字段 "first name" 在提交 后显示所选联系人值 。我的问题是字段出现了但是我不能设置好的数据,字段一直是空的。

public function buildForm(FormBuilderInterface $builder, array $options)
{

    $builder
        ->add('contacts', ChoiceType::class, [
            'label'       => 'Contact',
            'placeholder' => 'Choose a contact',
            'choices'     => $this->getContacts(),
            'mapped'      => false,
        ])
        ->setMethod('POST')
    ;

    $builder->get('contacts')->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {

        $contactId     = $event->getData();
        $parentForm    = $event->getForm()->getParent();

        $contactEntity = $exampleEm->getrepository(Contact::class)->find($contactId);
        $firstName     = $contactEntity->getFirstName();

        // where can I set the 'contactFirstname' data ?

        $parentForm
            ->add('contactFirstname', TextType::class, [
                'label' => 'First name',
            ]);
    })
    ;
}

如何输入正确的数据以便字段显示为预填?

编辑: 我找到了一个方法,但并不可怕:

$parentForm
            ->add('contactFirstname', TextType::class, [
                'label'         => 'First name',
                'empty_data'    => $firstName,
        ]);

'data' => $firstName不适合我。)

$parentForm->get('contactFirstname')->setData($firstName);也不行

也许在创建表单之前使用 setter?

https://symfony.com/doc/current/forms.html#building-the-form

您不能简单地设置 TextType 字段的 'data' 选项吗?

// ...

$contactEntity = $exampleEm->getrepository(Contact::class)->find($contactId);
$firstName     = $contactEntity->getFirstName();

$parentForm
    ->add('contactFirstname', TextType::class, [
         'label' => 'First name',
         'data' => $firstname //here?
     ]);

编辑:

根据 this post submitted on github,需要提交表单字段才能更改其数据。

在他的一个解决方案中,他像您一样使用 "empty_data"。

在另一个中,他将字段添加到构建器中。使用 display: "none"; 隐藏它,直到提交数据。

The docs

the data of an unmapped field can also be modified directly:

$form->get('agreeTerms')->setData(true);

所以试试这个:

$parentForm
        ->add('contactFirstname', TextType::class, [
            'label' => 'First name',
        ]);

$parentForm->get('contactFirstname')->setData($firstName);