2016-08-11 6 views
2

フォームコレクションフィールド(カスタムフィールドセット)にフォームエラーを適用しました。Symfonyフォームフィールドにもエラーがありますか?

if ($this->isFieldset($form, $field) && !empty($error)) { 
    $form->get($field)->addError(
     new FormError(
      ucfirst(str_replace('_', ' ', $field)) . ' is invalid.') 
     ); 
} 

フォームにエラーが適用されていますが、それでも有効とマークされていますか?

enter image description here

あなたがコントローラで見たようフォームははisValidが呼び出される前にabout_youの子のエラーを持っていますか?

enter image description here

任意の提案なぜですか?

+2

あなたが前に、アレイを追加しました'$ form-> isValid()'を呼び出した後に? –

+0

はいフォームを最初に作成したときに追加します(オーバーライドされたフォームファクタクラスで、Redisからエラーを取り出してフォームに追加します)。 – Kal

+1

カスタムフィールドセットのテストを作成しようとしましたか、それともフォームを作成してから、コントローラでgetErrors()/ isValid()を呼び出しましたか? – dbrumann

答えて

2

私はコードを掘って、このスニペットを見つけました:

public function buildView(FormView $view, FormInterface $form, array $options) 
{ 
    //... 

    $view->vars = array_replace($view->vars, array(
     'errors' => $form->getErrors(), 
     'valid' => $form->isSubmitted() ? $form->isValid() : true, //<=== HERE 
     'value' => $form->getViewData(), 
     'data' => $form->getNormData(), 
     'required' => $form->isRequired(), 
     'size' => null, 
     'label_attr' => $options['label_attr'], 
     'compound' => $form->getConfig()->getCompound(), 
     'method' => $form->getConfig()->getMethod(), 
     'action' => $form->getConfig()->getAction(), 
     'submitted' => $form->isSubmitted(), 
    )); 
} 

これはvalidが設定されているのみ場所のようです。これはbuildView中に起こることに注意してください!その後のすべてがvalidの値に影響しません。

フォームは現在有効であれば、我々は次のスニペットで見ることができるようにあなたは、単に、チェックするために$form->isValid()を使用することができますしかし、すべてが無駄であるない:

public function isValid() 
{ 
    if (!$this->submitted) { 
     return false; 
    } 

    if ($this->isDisabled()) { 
     return true; 
    } 

    return 0 === count($this->getErrors(true)); 
} 
+0

私は自分のフォームでbuildViewをオーバーライドして手動で設定できますか?私は奇妙なことをやっているので、予期しない動作が起こっています。 – Kal

+1

私はこの答えが誤解を招くと思います。問題は、問題の添付画像に見られるように、FormViewには間違いありません。 'createView()'が呼び出される前にブレークポイントが設定され、エラーのあるElement \ Form(FormViewではなく)が表示されます。その行で 'isValid()'が呼び出されます。次の行にステップするとき、ifブロックはスキップする必要があります。 @Kalあなたはこれが起こることを確認できますか? – dbrumann

+1

正直言ってわかりません。あなたの更新された質問を見ただけで、実際にはあなたは実際にはcreateView()を呼び出しているようです。それ以前のあなたの出力ですか? –

関連する問題