2017-03-05 14 views
0

これは私が達成したいものです。 (私はそれがより簡単だろうと思った)。 私はUserEntityを持っています。 このエンティティの各フィールドを有する: "@assert \ NOTNULL(グループ= {" ステップ1 "})" 又は "@assert \ NOTNULL(グループ= {" ステップ2 "})"Sf2は1つのページ上の多くのフォームで1つのformTypeを分割します

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; 

、私は私の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ボタンに続いてユーザー名inputTypeを、表示されます。 次に、City inputTypeとsubmitTwoボタンを表示します。

次に、ユーザーがサブミット1をクリックしてデータを検証し、このフィールドをデータベースに保存して保存します。ここで

が私の見解です:

{{ 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}) }} 

私はすべてが素晴らしい作品最初のフォームを送信します。 私は2番目のサブミットを提出すると、「無効なCSRFトークンエラー」があります。実際にはdomを見ると、最初のフォームだけがCSRFトークンで隠された入力タイプを持っています。

CSRFトークンを(テストと同様に)手動で入力しようとしましたが、フォームを送信するとこのフォームのデータは保持されますが、他のフォームのデータフォームはnullに設定されます。

私は今のところ固執しています。 多分私はこれを間違っている、一般的なアイデアは同じページ上の異なるフォームに単一のエンティティを分割することです。

ありがとうございます!

答えて

0

Symfonyは、セキュリティ上の脆弱性が生じるため、同じフォームのCSRFトークンを1ページに2回表示させることはできません。私はここで最善のアプローチは、同じモデルを使用する2つの別々のフォームを作成することだと考えています。グループを削除して、モデルに制約を残したり、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

関連する問題