2012-08-24 17 views
7

Próbuję grokować formularze aplikacyjne i zastanawiałem się, jak zaimplementować formularz, który sprawdza pola zależne od innych pól. Na przykład formularz rejestracyjny, który ma pola password i confirm_password i chciałbym sprawdzić poprawność tego password == confirm_password.Walidacja obejmująca wiele pól

Mogłem to zrobić po uruchomieniu formularza, w programie obsługi, ale oznaczałoby to utratę komunikatów o błędach.

Edit: Zapomniałem wspomnieć, mam głównie za pomocą formularzy aplikacyjnych Yesods, ale wydają się być całkiem blisko trawiennych funktorów

Odpowiedz

7

Jaki rodzaj systemu formy używasz? Można łatwo zrobić z digestive-functors, oto przykład jednego z moich formularzy rejestracyjnych:

registrationForm = 
    Registration 
     <$> "username" .: text Nothing 
     <*> "password" .: passwordConfirmer 
    where passwordConfirmer = 
      validate fst' $ (,) <$> ("p1" .: text Nothing) 
           <*> ("p2" .: text Nothing) 
     fst' (p1, p2) | p1 == p2 = Success p1 
         | otherwise = Error "Passwords must match" 

Tutaj można zobaczyć generować wartość dla mojego polu „Hasło” używając moje pole passwordConfirmer formularz. To pole używa 2 pól tekstowych i umieszcza je w krotce, ale po sprawdzeniu poprawności zajmuje tylko element fst (chociaż może to zająć snd, mamy gwarancję, że są równe!).

Moja Registration typ to:

data Registration = Registration 
    { regUserName :: Text 
    , regPassword :: Text 
    } 
+0

Używam yesods aplikacyjnych formy, ale jest to zbyt dobra odpowiedź – Masse