Sf2在一个页面上以多种形式拆分一个formType

时间:2017-03-05 21:34:26

标签: forms validation symfony

这是我想要实现的目标。 (我认为这会更容易)。 我有一个UserEntity。 该实体的每个字段都有:  “@Assert \ NotNull(groups = {”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',
            )
        )

我想要做的是显示Username inputType,然后是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。

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

谢谢!

1 个答案:

答案 0 :(得分:0)

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

UsernameType.php

<ul>
  <li>
    <a href="#">Item1</a>
  </li>
  <li>
    <a href="#">Item2 Text isveryveryveryvery longer</a>
  </li>
  <li>
    <a href="#">Item3</a>
  </li>
  <li>
    <a href="#">Item4</a>
  </li>
  <li>
    <a href="#">Item5</a>
  </li>
</ul>

CityType.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
        ))
    ;
}

控制器:

$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()
);