这是我想要实现的目标。 (我认为这会更容易)。 我有一个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。
我现在有点卡住了。 也许我做错了,一般的想法是在同一页面上将单个实体拆分成不同的形式。
谢谢!
答案 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()
);