2012-07-07 8 views
13

In meiner Lehre Einheit, die data_class für meine Form ist habe ich eine Datei Eigenschaft wie folgt definiert:Nicht leere Datei Eingabefeld in Symfony2 Form

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

Auch hinzugefügt mit ->add('file', 'file') Typ zu bilden ...

Erstellen Entität funktioniert perfekt, aber das Problem ist, wenn ich Formular zum Aktualisieren dieser Entität verwenden. Es fragt erneut nach der Datei, da es @ Assert \ NotBlank hat. Da ich andere Felder in diesem Formular habe, möchte ich das Bild nicht bei jedem Update neu laden.

Wenn ich @Assert \ NotBlank entferne, funktioniert alles einwandfrei, aber ich möchte dieses Dateifeld obligatorisch sein.

Irgendeine Idee?

Antwort

7

Sie haben zwei Möglichkeiten, aus dieser Situation und beide verlassen sich auf Callback Validatoren: (Symfony callback)

Entweder boolean genannt isUpdate Sie Einheit hinzufügen, die beibehalten werden nicht und wird Validator sagen, die Operation versucht wurde. Diese Methode ist im obigen Link vollständig beschrieben.

Eine andere Möglichkeit, dies zu beheben, besteht darin, Callback-Validierer direkt zu Ihrem Formulartyp hinzuzufügen. Auch hier werden einige isUpdate Flaggen aber dieses Mal innerhalb Formulartypen benötigt werden (es über Konstruktor übergeben):

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.'));     
     } 
    })); 
} 

Vielleicht simplier Weise gibt es gewünscht Validierung zu erreichen, aber ich kam auf diese beide paar Monate zurück.

Hope this helps ...

+1

Danke, das gab mir Ideen, definatelly :) Ich verstehe nicht, warum Sie einen anderen booleschen isUpdate brauchen, und wie werden diese Werte gesetzt? Ich habe 'if (null! == $ this-> getId())' überprüft. Sie können meine wichtigsten https://gist.github.com/3066507 überprüfen. Es war sogar schicker in Symfony 2.0, wenn Sie im Zusammenhang mit Validator https://gist.github.com/3066488 übergeben können. Danke noch einmal. – umpirsky

+0

Oh, guter Punkt. Durch den Vergleich der Entity-ID mit NULL können Sie definitiv sagen, ob die Operation "add" oder "update" ist. Und der zweite Punkt ist die perfekte Lösung, denke ich :) –

+0

Ja, schade, dass sie ExecutionContext geschlossen haben und es nicht mehr möglich ist, den Eigenschaftspfad von außerhalb der Klasse zu setzen https://github.com/symfony/symfony/blob/ac6939441fb61a17184f536391387aca78b10013 /src/Symfony/Component/Validator/ExecutionContext.php – umpirsky

6

können Sie auch Validation Groups dafür. Eine Validierungsgruppe (möglicherweise die Standardgruppe) wird für die Erstellung und die zweite für die Aktualisierung verwendet.

+0

Sollte die angenommene Antwort sein IMO – Shady

+0

Ich weiß, das ist wirklich alt, aber könnten Sie ein wenig ausarbeiten? Ich habe Mühe, die Dokumentation darüber zu verstehen, es ist nicht wirklich noob-freundlich. Wenn Sie es v3-konform machen können, wäre es wirklich nett zu –

Verwandte Themen