【问题标题】:Sf2 split one formType in many form on one pagesf2在一页上以多种形式拆分一个formType
【发布时间】:2017-03-06 15:24:33
【问题描述】:

这是我想要实现的目标。 (我认为这会更容易)。 我有一个用户实体。 该实体的每个字段都有一个: “@Assert\NotNull(组={“step-1”})” 或者 "@Assert\NotNull(groups={"step-2"})"

/** @ORM\Column(name="username", type="string", length=255, nullable = true)     
* @Assert\NotNull(groups={"step-1"}) 
*/
protected $username;


/** @ORM\Column(name="city", type="string", length=255, nullable = true)     
* @Assert\NotNull( groups={"step-2"} ) 
*/
protected $city;

在 formType 上,我有 2 个字段和 2 个提交按钮:

->add('username')
->add('city')
 ->add('submit_form_1', SubmitType::class, array(
            'validation_groups' => 'step-1',
            )
        )
->add('submit_form_2', SubmitType::class, array(
            'validation_groups' => 'step-2',
            )
        )

我想做的是显示用户名输入类型,然后是 submitOne 按钮。 然后显示 City inputType,然后是 submitTwo 按钮。

然后,当用户点击提交时,验证数据,并将该字段保存在数据库中。

这是我的看法:

{{ form_start(form, { 'action': path('fos_user_profile_edit'), 'attr': { 'novalidate' : 'novalidate', 'class': 'fos_user_profile_edit' } }) }}
{{ form_row(form.userType.city) }}
{{ form_widget(form._token) }}
{{ form_widget(form.userType.submit_form_2) }}
{{ form_end(form, {'render_rest': false}) }}

{{ form_start(form, { 'action': path('fos_user_profile_edit'), 'attr': { 'novalidate' : 'novalidate', 'class': 'fos_user_profile_edit' } }) }}
{{ form_row(form.userType.username) }}
{{ form_widget(form._token) }}
{{ form_widget(form.userType.submit_form_1) }}
{{ form_end(form, {'render_rest': false}) }}

当我提交第一个表单时,一切都很好。 当我提交第二个表单时,我得到了一个“无效的 CSRF 令牌错误”,实际上,如果我查看 dom,只有第一个表单的输入类型隐藏了 CSRF 令牌。

我确实尝试手动输入 CSRF 令牌(仅作为测试),当我提交表单时,该表单的数据被持久化,但另一个表单的数据表单设置为 null。

我现在有点卡住了。 也许我做错了,一般的想法是在同一页面上将单个实体拆分为不同的形式。

谢谢!

【问题讨论】:

    标签: forms validation symfony


    【解决方案1】:

    我不相信 Symfony 会让你在一个页面上为同一个表单渲染两次 CSRF 令牌,因为它会产生安全漏洞。我相信这里最好的方法是创建两个使用相同模型的单独表单。您可以删除组并保留模型上的约束或将它们移动到 formType。

    用户名类型.php

    $builder
        ->add('username')
        ->add('submit', 
            SubmitType::class, 
            array(
                'constraints' => array(
                    new NotNull()
                )
            )
        )
    ;
    
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver
            ->setDefaults(array(
                'data_class' => userType::class
            ))
        ;
    }
    

    CityType.php

    $builder
        ->add('city')
        ->add('submit', 
            SubmitType::class, 
            array(
                'constraints' => array(
                    new NotNull()
                )
            )
        )
    ;
    
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver
            ->setDefaults(array(
                'data_class' => userType::class
            ))
        ;
    }
    

    控制器:

    $usernameType = new UsernameType();
    $cityType = new CityType();
    
    return array(
        'usernameType' => $usernameType->createView(),
        'cityType' => $cityType->createView()
    );
    

    模板:

    {{ form(usernameType) }}
    {{ form(cityType) }}
    

    【讨论】:

    • 这个答案有帮助吗?
    猜你喜欢
    • 2013-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多