2011-11-05 11 views
7

symfony2 FormValidatorコンポーネントでクライアントサイドフォームの検証を作成すると非常に便利だと思います。symfony2でクライアント側とサーバ側の両方の検証を組み合わせて作成する

これを行う最善の方法は、検証制約をフォームビューに渡すことです。その情報で このようなものにフォームフィールドをレンダリングするテンプレートを作成することが可能であろう:

<div> 
    <label for="form_email">E-Mail</label> 
    <input 
     id="form_email" type="text" name="form[email]" value="" 
     data-validation-constraints='{"NotBlank":{},"MinLength":{"limit":6}}' 
    /> 
</div> 

JavaScriptの一部はその後data-validation-constraints属性を持つすべての<input>の要素を検索し、正しい検証を作成することです彼らのために。

フォームビューに検証制約を渡すには、フォームタイプ拡張を作成することをお勧めします。それは私の質問のポイントです:これは正しい方法ですか?これはどのように可能ですか?現時点で

は私のフォームタイプの拡張機能は次のようになります。

use Symfony\Component\Form\FormInterface; 
use Symfony\Component\Form\FormView; 
use Symfony\Component\Form\FormBuilder; 

class FieldTypeExtension extends \Symfony\Component\Form\AbstractTypeExtension{ 

    public function getExtendedType(){ 
     return 'field'; 
    } 

    public function buildView(FormView $view, FormInterface $form) 
    { 
     // at this point i didn't find a way to get the 
     // validation constraints out of the $form 
     // the `getAllValidationConstraints` here is just an example 
     $view->set('validation_constraints', $form->getAllValidationConstraints()); 
    } 

} 

どのように私はFormInterfaceオブジェクトのうちの1つのフォームフィールドに適用されるすべての検証制約を得ることができますか?

FIELDTYPEがすでに直接表示するには、のattr VARとして渡されるフォームにのattr属性を渡します。

+0

JavaScript検証の支配者にフォームタイプの制約を変換し、新しいsymfonyの2バンドルです。現時点では、エンティティのアノテーションで定義されている制約のみで動作します。どこから来たかに関わらず、すべての制約を取りたいと思っています。 'isValid'メソッドが使用するconstaintsを見つけるために同じメカニズムを使いたいと思います。 – ausi

答えて

0

あなたは何かsimplierを行うことができます。このattrフォームの属性をデータ検証制約属性を追加するために変更する方がいいです。これは、新しいvarを処理するためにフォームテーマをカスタマイズする必要がないためです。

<?php 

namespace MyBundle\Form\Type; 

use Symfony\Component\Form\AbstractTypeExtension; 
use Symfony\Component\Form\FormBuilder; 

class FieldTypeJsValidationExtension extends AbstractTypeExtension 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $attr = $builder->getAttribute('attr'); 
     $attr = array_merge(
      array(
       'data-validation-constraints' => $this->aMethodThatRenderTheFinalContentOfTheValidationAttribute(), 
      ), 
      $builder->getAttribute('attr') 
     ); 

     $builder->setAttribute('attr', $attr); 
    } 

    public function getExtendedType() 
    { 
     return 'field'; 
    } 

} 
+0

buildFormメソッドを使用しています。この時点では、FormInterfaceオブジェクトへの参照はありません。私は、現在のフォームフィールドのすべての制約を取得するには、このオブジェクトへの参照が必要になると思います。しかし、私は確信していません... 私の質問は、FormInterfaceオブジェクトから1つのフォームフィールドに適用されたすべての検証制約を取得する方法でした – ausi

2

それを行うSimpleThingsFormExtraBundleへの参照(またはむしろ、そのバンドルの特定、オープンPR)が含まれ、対応する未解決の問題"[Form] JavaScript validation"を確認してください。

関連する問題