2012-07-07 6 views
13

Nel mio un'entità Doctrine, che è data_class per la mia forma ho una proprietà di file definito in questo modo:non vuoto campo di input di file in forma Symfony2

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

Inoltre, ha aggiunto per formare tipo con ->add('file', 'file') ...

La creazione di entità funziona perfettamente, ma il problema è quando utilizzo il modulo per aggiornare questa entità. Richiede di nuovo il file, poiché ha @Assert \ NotBlank. Dato che ho altri campi in questo formato, non voglio ricaricare l'immagine su ogni aggiornamento.

Quando rimuovo @Assert \ NotBlank, everithing funziona correttamente, ma voglio che questo campo file sia obbligatorio.

Qualche idea?

risposta

7

Avete due vie d'uscita a questa situazione ed entrambi si basano su Callback validatori: (Symfony callback)

O aggiungere boolean nome isUpdate a voi entità che non sarà persistente e vi dirà validatore che ha tentato il funzionamento. Questo metodo è completamente descritto nel link sopra.

Un altro modo per risolvere questo problema è aggiungere direttamente il convalida Callback al tipo di modulo. Anche in questo caso, sarà necessario un po 'di isUpdate bandiera, ma questa volta all'interno tipo di modulo (passa via costruttore):

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

forse c'è modo più semplice per ottenere la convalida desiderata, ma mi sono imbattuto in questi due qualche mese fa.

Spero che questo aiuti ...

+1

Grazie, mi ha dato idee, sicuramente :) Non capisco perché hai bisogno di un altro booleano di isUpdate, e come vengono impostati i valori? Ho controllato 'if (null! == $ this-> getId())'. Puoi controllare il mio succo https://gist.github.com/3066507. È stato persino più divertente in Symfony 2.0 quando è possibile passare contestualmente al validatore https://gist.github.com/3066488. Grazie ancora. – umpirsky

+0

Oh, buon punto. Confrontando l'id dell'entità con null si potrebbe sicuramente dire se l'operazione è "aggiungi" o "aggiorna". E il secondo aspetto è la soluzione perfetta suppongo :) –

+0

Sì, peccato hanno chiuso ExecutionContext e non è possibile impostare il percorso della proprietà da fuori della classe più https://github.com/symfony/symfony/blob/ac6939441fb61a17184f536391387aca78b10013 /src/Symfony/Component/Validator/ExecutionContext.php – umpirsky

6

È inoltre possibile utilizzare la convalida Gruppi per questo. Un gruppo di convalida (forse uno di default) sarà per la creazione e il secondo per l'aggiornamento.

+0

Dovrebbe essere la risposta accettata IMO – Shady

+0

So che questo è davvero vecchio ma potresti elaborare un po '? Sto faticando a capire la documentazione a riguardo, non è davvero noob-friendly. Se riesci a renderlo conforme a v3, sarebbe davvero bello –