Symfony 6-无法将数据注入post_submit上的动态formtype

发布于 2025-02-04 03:41:08 字数 3190 浏览 2 评论 0原文

我的嵌套形式有问题。我无法获得要通过的值。 这是一个简单的示例来复制我的问题,我想根据所选房屋以我的形式为用户预填充表格。
如果要测试,这是文件。我想注入rogerbilly的值的值,但我的用户

模型

class Test
{
    /**
     * @var string|null
     */
    private $house;

    /**
     * @var TestUser|null
     */
    private $user;

    // Getters & Setters of course...   
}
class TestUser
{
    /**
     * @var string|null
     */
    private $name;

    /**
     * @var int|null
     */
    private $age;

    // Getters & Setters again...
}

class TestType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('house', ChoiceType::class, [
                    'choices' => [
                        'first'  => 1,
                        'second' => 2,
                    ],
                ]
            );

        $builder->get('house')->addEventListener(FormEvents::POST_SUBMIT, [$this, 'addUser']);
    }


    function addUser(FormEvent $event)
    {
        $form  = $event->getForm()->getParent();
        $house = $event->getForm()->getData();

        if (!$house) {
            return;
        }

        // here is the part where I choose the user I want to use 
        // for the rest of the example (which does not work)
        $testUser = $house === 1
            ? (new TestUser())->setName('roger')->setAge(65)
            : (new TestUser())->setName('billy')->setAge(22);

        $builder = $form->getConfig()->getFormFactory()->createNamedBuilder('user', TestUserType::class, $testUser, [
            'auto_initialize' => false,
        ]);

        $form->add($builder->getForm());
    }

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

始终

class TestUserType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('name', TextType::class, ['label' => 'username'])
            ->add('age', IntegerType::class, ['label' => 'age']);
    }

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

public function testForm(Request $request): RedirectResponse|Response
{
    // ...
    $test = new Test();
    $form = $this->createForm(TestType::class, $test);
    $form->handleRequest($request);
    // ...
}

字段

{{ form_start(formtest) }}
  <p>
    <button class="btn btn-primary" type="submit">test go</button>
  </p>
{{ form_end(formtest) }}

空 欢迎

I have a problem with a nested form. I can't get the values I want to pass.
Here is a simple example to reproduce my problem, I would like to pre-fill a form about a user according to the selected house in my form.
Here are the files, if you want to test. I would like to inject the values of roger and billy the good way but my user fields are always empty

The models

class Test
{
    /**
     * @var string|null
     */
    private $house;

    /**
     * @var TestUser|null
     */
    private $user;

    // Getters & Setters of course...   
}
class TestUser
{
    /**
     * @var string|null
     */
    private $name;

    /**
     * @var int|null
     */
    private $age;

    // Getters & Setters again...
}

The main form

class TestType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('house', ChoiceType::class, [
                    'choices' => [
                        'first'  => 1,
                        'second' => 2,
                    ],
                ]
            );

        $builder->get('house')->addEventListener(FormEvents::POST_SUBMIT, [$this, 'addUser']);
    }


    function addUser(FormEvent $event)
    {
        $form  = $event->getForm()->getParent();
        $house = $event->getForm()->getData();

        if (!$house) {
            return;
        }

        // here is the part where I choose the user I want to use 
        // for the rest of the example (which does not work)
        $testUser = $house === 1
            ? (new TestUser())->setName('roger')->setAge(65)
            : (new TestUser())->setName('billy')->setAge(22);

        $builder = $form->getConfig()->getFormFactory()->createNamedBuilder('user', TestUserType::class, $testUser, [
            'auto_initialize' => false,
        ]);

        $form->add($builder->getForm());
    }

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

The user form type

class TestUserType extends AbstractType
{

    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
            ->add('name', TextType::class, ['label' => 'username'])
            ->add('age', IntegerType::class, ['label' => 'age']);
    }

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

The controller

public function testForm(Request $request): RedirectResponse|Response
{
    // ...
    $test = new Test();
    $form = $this->createForm(TestType::class, $test);
    $form->handleRequest($request);
    // ...
}

The view

{{ form_start(formtest) }}
  <p>
    <button class="btn btn-primary" type="submit">test go</button>
  </p>
{{ form_end(formtest) }}

all help is welcome

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

断念 2025-02-11 03:41:08

Setter实际上返回$吗?

当执行 - &GT; setage(65)时。

因为这不清楚,所以您不在您提供的代码中。

Is setter actually returning $this?

When ->setAge(65) is executed.

Because it's not clear, it's not in your code you provided here.

找个人就嫁了吧 2025-02-11 03:41:08

您需要将$ user $ age $ house 和$ name链接到您拥有的输入字段。
您始终获得空输出的原因是变量的非变量指的是任何数据源。

you need to link the $user $age $house and $name to the input fields you have.
The reason why you always get an empty output is do to the face that non of the variables refer to any data source.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文