2017-03-05 68 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