From a6f85b9b8894a7817baad1a5e850366d02eb197a Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Wed, 13 Jan 2016 18:18:06 +0100 Subject: FFP 11.1 --- ws2015/ffp/blaetter/11/FFP_U11-3_Yesod.hs | 145 ++++++++++++++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 ws2015/ffp/blaetter/11/FFP_U11-3_Yesod.hs (limited to 'ws2015/ffp/blaetter/11/FFP_U11-3_Yesod.hs') diff --git a/ws2015/ffp/blaetter/11/FFP_U11-3_Yesod.hs b/ws2015/ffp/blaetter/11/FFP_U11-3_Yesod.hs new file mode 100644 index 0000000..badd9e0 --- /dev/null +++ b/ws2015/ffp/blaetter/11/FFP_U11-3_Yesod.hs @@ -0,0 +1,145 @@ +-- Fortgeschrittene Funktionale Programmierung, +-- LMU, TCS, Wintersemester 2015/16 +-- Steffen Jost, Alexander Isenko +-- +-- Übungsblatt 11. 13.01.2016 +-- +-- Teilaufgabe +-- A11-3 Yesod: Applikative Formulare +-- +-- Betrachten Sie das Beispiel aus der Vorlesung zu applikativen Formularen. +-- Der Code ist hier vollständig enthalten und sollte problemlos ausführbar sein. + +-- a) +-- Erweiteren Sie diese Webapplikation um eine Seite, auf der ein Benutzer +-- mit einem Formular zur Eingabe einer positiven ganzen Zahl auffordert. +-- Der Benutzer wird ggf. solange erneut aufgefordert, bis eine positive ganze Zahl ermittelt wurde; +-- danach wird die Zahl einfach auf dem Bildschirm ausgegeben. + + + +-- b) +-- Erweitern Sie Ihr Programm aus der vorherigen Teilausgabe, so dass +-- je nach der eingegebenen Zahl ein Formular zur Eingabe dieser Anzahl +-- an Autos (gemäß dem Beispiel) abgefragt werden. +-- +-- Nutzen Sie dazu die Möglichkeit zur Kombination mehrerer Formulare in Yesod! +-- Auch für 5 Autos soll nur ein einziges Formular mit einem einzelnen Absenden-Knopf +-- angzeigt werden, welches entsprechend viele Felder für 5 Autos enthält. +-- +-- Nach dem Absenden des Formulares, sollen die eingegebenen Autos einfach nur +-- auf dem Bildschrim dargestellt werden. +-- +-- Ein Beispiel zur Kombination zweier Formulare zu einem einzigen Formular: +-- +-- twoCarAForm :: AForm Handler (Car,Car) +-- twoCarAForm = (,) <$> carAForm <*> carAForm +-- + + +{-# LANGUAGE GADTs #-} +{-# LANGUAGE ViewPatterns #-} +{-# LANGUAGE MultiParamTypeClasses #-} +{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE TemplateHaskell, QuasiQuotes #-} + + +import Yesod +import Data.Text +import Control.Applicative +import Yesod.Form + + +{- LÖSUNGSVORSCHLAG -} + +main :: IO () +main = warp 3000 CarApp + + +data CarApp = CarApp + +instance Yesod CarApp + +instance RenderMessage CarApp FormMessage where + renderMessage _ _ = defaultFormMessage + +mkYesod "CarApp" [parseRoutes| +/ HomeR +/car/#Int CarR +|] + + + +data Car = Car { carModel :: Text + , carYear :: Int + , carColor :: Maybe Text + } + deriving Show + +carAForm :: AForm Handler Car +carAForm = Car + <$> areq textField "Model" Nothing + <*> areq intField "Year" (Just 1996) + <*> aopt textField "Color" Nothing + +carForm :: Html -> MForm Handler (FormResult Car, Widget) +carForm = renderBootstrap2 carAForm + +-- Beispiel zur Kombination zweier applikativer Formulare zu einem: +twoCarAForm :: AForm Handler (Car,Car) +twoCarAForm = (,) <$> carAForm <*> carAForm + + +handleHomeR :: Handler Html +handleHomeR = redirect $ CarR 3 + + +handleCarR :: Int -> Handler Html +handleCarR n = do + ((result,widget), enctype) <- runFormPost $ carForm + case result of + FormMissing -> defaultLayout $ do + setTitle "Form Demo" + [whamlet| +

Form Demo +
+ ^{widget} +