创建没有小村庄的单子 yesod 形式
Creation of monadic yesod form without hamlet
我的目标是编写一个不使用 hamlet 的 monadic yesod 形式。
假设我有这样的示例表单:
userForm :: Maybe User -> Html -> MForm Handler (FormResult User, Widget)
userForm u extra = do
(nameR, nameV) <- mreq textField "" (userName <$> u)
(passR, passV) <- mreq passwordField "" Nothing
let userRes = User <$> nameR <*> passR
let widget = do
toWidget $ \render -> do
extra
-- fvInput nameV?
-- fvInput passV?
H.input ! type_ "submit" ! value "Submit"
return (userRes, widget)
在使用 hamlet 的情况下,它将是这样的:
let widget = do
toWidget [whamlet|
^{fvInput nameV}
^{fvInput passV}
|]
但是 fvInput 的 return 类型是 FieldView App
,我需要将其转换为 Html 才能很好地与 blaze 组合。
也许,使用输入表单来完成这项任务会更容易(即在没有 w/hamlet 的情况下实现表单),但是 yesodbook 上的文档说它没有正确处理错误的输入案例。我倾向于在这里使用 monadic 形式,因为我想在此处验证失败 "for free" 的情况下重新创建用户输入。这样可以吗?
将 lift
与 widgetToPageContent
一起使用:
userForm :: Maybe MyUser -> Html -> MForm Handler (FormResult MyUser, Widget)
userForm u extra = do
(nameR, nameV) <- mreq textField "" (myUserName <$> u)
(passR, passV) <- mreq passwordField "" Nothing
nameContents <- lift $ widgetToPageContent (fvInput nameV)
passContents <- lift $ widgetToPageContent (fvInput passV)
let userRes = MyUser <$> nameR <*> passR
let widget = do
toWidget $ \render -> do
extra
pageBody nameContents render
pageBody passContents render
H.input H.! A.type_ "submit" H.! A.value "Submit"
return (userRes, widget)
我的目标是编写一个不使用 hamlet 的 monadic yesod 形式。
假设我有这样的示例表单:
userForm :: Maybe User -> Html -> MForm Handler (FormResult User, Widget)
userForm u extra = do
(nameR, nameV) <- mreq textField "" (userName <$> u)
(passR, passV) <- mreq passwordField "" Nothing
let userRes = User <$> nameR <*> passR
let widget = do
toWidget $ \render -> do
extra
-- fvInput nameV?
-- fvInput passV?
H.input ! type_ "submit" ! value "Submit"
return (userRes, widget)
在使用 hamlet 的情况下,它将是这样的:
let widget = do
toWidget [whamlet|
^{fvInput nameV}
^{fvInput passV}
|]
但是 fvInput 的 return 类型是 FieldView App
,我需要将其转换为 Html 才能很好地与 blaze 组合。
也许,使用输入表单来完成这项任务会更容易(即在没有 w/hamlet 的情况下实现表单),但是 yesodbook 上的文档说它没有正确处理错误的输入案例。我倾向于在这里使用 monadic 形式,因为我想在此处验证失败 "for free" 的情况下重新创建用户输入。这样可以吗?
将 lift
与 widgetToPageContent
一起使用:
userForm :: Maybe MyUser -> Html -> MForm Handler (FormResult MyUser, Widget)
userForm u extra = do
(nameR, nameV) <- mreq textField "" (myUserName <$> u)
(passR, passV) <- mreq passwordField "" Nothing
nameContents <- lift $ widgetToPageContent (fvInput nameV)
passContents <- lift $ widgetToPageContent (fvInput passV)
let userRes = MyUser <$> nameR <*> passR
let widget = do
toWidget $ \render -> do
extra
pageBody nameContents render
pageBody passContents render
H.input H.! A.type_ "submit" H.! A.value "Submit"
return (userRes, widget)