13

私のフォーム用のDoctrineエンティティにはdata_class、次のように定義されたファイルプロパティがあります。

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

また、フォームタイプに追加しました->add('file', 'file')...

エンティティの作成は完璧に機能しますが、問題は、フォームを使用してこのエンティティを更新する場合です。@ Assert \ NotBlankがあるため、ファイルを再度要求します。このフォームには他のフィールドがあるので、更新のたびに画像を再アップロードしたくありません。

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

何か案が?

4

3 に答える 3

7

そのために検証グループを使用することもできます。1つの検証グループ(おそらくデフォルトのグループ)は作成用で、2番目は更新用です。

于 2013-03-11T11:21:43.267 に答える
7

この状況を回避する方法は2つあり、どちらもCallbackバリデーターに依存しています:( Symfonyコールバック

永続化されず、どの操作が試行されたかをバリデーターに通知するboolean名前付きエンティティを追加します。isUpdateこの方法は、上記のリンクで完全に説明されています。

これに取り組む別の方法は、コールバックバリデーターをフォームタイプに直接追加することです。繰り返しになりますが、いくつかの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.'));                  
        }
    }));
}

希望する検証を実現するためのより簡単な方法があるかもしれませんが、私はこの2、3か月前に出くわしました。

お役に立てれば...

于 2012-07-07T09:03:43.457 に答える
0

私も同じような状況でした。ファイルへのパスを使用してデータベース内の既存のレコードを編集しようとしています。レコードを編集するときは、新しいファイルをアップロードする必要がありますが、これはユーザーにとって快適ではありません。私のソリューションでは、ファイルハッシュと変数ファイル名に変数tmpファイルを使用します。アクション編集クラスで行った必要なすべての操作。

以下のリンクの完全なサンプルアクションクラス

https://github.com/marekz/php_examples/wiki/Symfony-how-to-edit-attachment-form

于 2018-08-07T20:30:03.657 に答える