Natknąłem się ostatnio na problem. Otóż wszystkie formularze walidujemy przy wykorzystaniu symfoniowych Formsów. Standardowe użycie podczas aktualizacji obiektu Place wygląda następująco:
$this->form = new PlaceForm ($place); $this->form->bind ($request->getParameter ('place')); if ($this->form->isValid()) { $place = $this->form->updateObject(); $place->save(); }
Co jednak kiedy nie chcemy walidować całego formularza? Np. w przypadku kiedy używając InPlaceEditora zmieniamy jedno pole. Podpowiem, że próba wysłania tylko tego jednego pola i wykorzystaniu tej samej akcji skończy się wyzerowaniem pozostałych pól.
Dokumentacja symfony niestety milczy na ten temat (choć przyznam się, że nie szukałem jakoś strasznie dokładnie), a wiemy chyba wszyscy co jest jej największą bolączką - opisanie tylko kilku funkcjonalności poszczególnych modułów. Jak się chce czegoś więcej, to droga wolna - szukajcie sobie sami w kodzie.
Tak też postąpiłem. I po koszmarnie długim czasie odkryłem, że do walidowania każdego z pól służy metoda o intuicyjnej nazwie... clean(). Przykład walidacji jednego pola:
$form = new PlaceForm($place); try { $cleaned = $form->getValidator($field_name)->clean($value); #1 $place->setByName($field_name, $cleaned, BasePeer::TYPE_FIELDNAME); #2 $place->save(); } catch (sfValidatorError $e) #3 { #Obsługa błędu }
clean(), która w przypadku, gdy pole ma poprawną wartość zwraca je. A w przypadku błędu wyrzuca wyjątek sfValidatorError,Mam nadzieję, że ten krótki artykuł pozwoli komuś zaoszczędzić trochę czasu.
Wpis opublikowałem także na firmowym blogu code42.