2017-03-05 54 views
0

这是我想实现的。 (我认为这会更容易)。 我有一个UserEntity。 每个该实体的字段具有: “@assert \ NOTNULL(组= {” 步骤-1 “})” 或 “@assert \ NOTNULL(组= {” 第2步 “})”Sf2在一页上以多种形式分割一个formType

/** @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', 
      ) 
     ) 

我想要做的是显示用户名的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

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

UsernameType.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) }} 
+0

这个答案有帮助吗? – Ryguydg