2012-07-07 17 views
13

私のフォームのdata_classである私のDoctrineのエンティティでは、私はこのように定義されたファイルのプロパティがあります。また非空白のファイル入力フィールド

/** 
    * Image. 
    * 
    * @Assert\NotBlank 
    * @Assert\File 
    * @Assert\Image(minWidth="138", minHeight="96") 
    */ 
    protected $file; 

は、->add('file', 'file')とタイプを形成するためにこれを追加しました...

エンティティの作成は完璧ですが、フォームを使用してこのエンティティを更新すると問題が発生します。それは@Assert \ NotBlankを持っているので、ファイルをもう一度尋ねます。このフォームには他のフィールドがあるので、私はすべてのアップデートでイメージを再アップロードしたくありません。

@Assert \ NotBlankを削除すると、everithingは正常に機能しますが、このファイルフィールドを必須にします。

答えて

7

あなたは、このような状況アウト2つの方法があり、どちらもCallbackバリデータに依存している:(Symfony callback

いずれかの永続化されず、操作しようとしたバリデーターを教えてくれるあなたのエンティティにisUpdateという名前booleanを追加します。この方法は上記のリンクで完全に説明されています。

これに対処するもう1つの方法は、Callbackバリデーターをフォームタイプに直接追加することです。ここでも、いくつかのisUpdateフラグが必要とされますが、フォームタイプ内のこの時間は、(コンストラクタを介して、それを渡す):

if ($this->isUpdate == false){ 
    $builder->addValidator(new CallbackValidator(function(FormInterface $form){ 
     if ($form['image_file']->getData() == NULL){ 
      $form->addError(new FormError('You need to specify image file.'));     
     } 
    })); 
} 

が多分必要な検証を達成するためのsimplier方法があるが、私は戻ってこれら二つの数ヶ月に出くわしました。

希望します。

+1

ありがとう、それは私にアイデアを与えましたdefinatelly :)なぜあなたは別のisUpdateブール値が必要なのか分からず、その値はどのように設定されていますか? 'if(null!== $ this-> getId())'をチェックしました。私の要点https://gist.github.com/3066507を確認することができます。検証者https://gist.github.com/3066488にコンテキストを渡すことができたときには、Symfony 2.0でもファンシーでした。再度、感謝します。 – umpirsky

+0

ああ、良い点。エンティティIDとnullを比較することで、操作が「追加」か「更新」かどうかを確実に判断できます。そして、第二の要点は私が推測する完璧な解決策です:) –

+0

ええ、あまりにも彼らはExecutionContextを閉じ、クラスの外からプロパティパスを設定することはできませんhttps://github.com/symfony/symfony/blob/ac6939441fb61a17184f536391387aca78b10013 /src/Symfony/Component/Validator/ExecutionContext.php – umpirsky

6

また、検証グループを使用することもできます。 1つの検証グループ(たぶんデフォルトのもの)が作成用で、2番目の更新用グループになります。

+0

受け入れられる回答でなければなりませんIMO – Shady

+0

これは本当に古かったのですが、ちょっと説明できますか?私はそれについての文書を理解するのに苦労しています、それは本当に親切ではありません。あなたがそれをv3準拠にすることができれば、本当にうれしいでしょう –

関連する問題