2012-07-07 13 views
13

W moim podmiot doktrynę, która jest data_class na moim formularzu mam właściwość pliku zdefiniowane tak:Non puste pole wejściowe plik w postaci Symfony2

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

Również dodaną go tworząc rodzaj z ->add('file', 'file') ...

Tworzenie jednostki działa idealnie, ale problem występuje, gdy używam formularza do aktualizacji tego obiektu. Prosi o ponowne przesłanie pliku, ponieważ ma on znak @Asert/NotBlank. Ponieważ mam inne pola w tej formie, nie chcę ponownie ładować obrazu przy każdej aktualizacji.

Kiedy usuwam @Assert \ NotBlank, everighting działa dobrze, ale chcę, aby to pole pliku było obowiązkowe.

Każdy pomysł?

Odpowiedz

7

Masz dwie drogi wyjścia tej sytuacji i oba opierają się na Callback walidatorami: (Symfony callback)

Albo dodać boolean nazwie isUpdate do ciebie jednostki, które nie będą utrzymywały i powie walidator których operacja została podjęta. Ta metoda jest całkowicie opisana w powyższym linku.

Innym sposobem rozwiązania tego problemu jest bezpośrednie dodanie weryfikatora wywołania zwrotnego do typu formularza. Ponownie, niektóre isUpdate flaga będzie potrzebne, ale tym razem w obrębie rodzaju forma (przekazać go za pośrednictwem konstruktora):

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

Może jest prostszy sposób, aby osiągnąć pożądany walidacji ale natknąłem się na tych dwóch miesiącach z powrotem.

Nadzieja to pomaga ...

+1

Dzięki, że dali mi pomysły, zdecydowanie :) Nie rozumiem, dlaczego potrzebujesz innej wartości boolean isUpdate i jak ustawiono te wartości? Sprawdziłem 'if (null! == $ this-> getId())'. Możesz sprawdzić mój temat https://gist.github.com/3066507. Symfony 2.0 było nawet fascynujące, kiedy można przekazać kontekst do walidatora https://gist.github.com/3066488. Dzięki jeszcze raz. – umpirsky

+0

Dobra sprawa. Porównując identyfikator podmiotu z wartością null można zdecydowanie stwierdzić, czy operacja to "dodaj" czy "zaktualizuj". I drugi punkt jest idealnym rozwiązaniem, jak sądzę :) –

+0

Tak, szkoda, że ​​zamknęli ExecutionContext i nie jest możliwe ustawienie ścieżki własności spoza klasy więcej https://github.com/symfony/symfony/blob/ac6939441fb61a17184f536391387aca78b10013 /src/Symfony/Component/Validator/ExecutionContext.php – umpirsky

6

Można również użyć grupy Validation za to. Jedna grupa walidacyjna (być może domyślna) będzie dla tworzenia i druga dla aktualizacji.

+0

Powinna być zaakceptowana odpowiedź IMO – Shady

+0

Wiem, że to jest naprawdę stare, ale czy mógłbyś trochę rozwinąć? Staram się zrozumieć dokumentację na ten temat, nie jest ona przyjazna Noobowi. Jeśli możesz sprawić, że będzie zgodny z V3, byłoby naprawdę miło –

Powiązane problemy