创建没有哈姆雷特的monadic yesod形式

时间:2016-08-10 21:58:47

标签: haskell yesod

我的目标是在不使用哈姆雷特的情况下编写一个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的返回类型是FieldView App,我需要将它转换为Html才能很好地构建。

也许,使用输入表单更容易完成这项任务(即实现没有w / hamlet的表单),但yesodbook上的文档说它没有正确处理错误的输入案例。我倾向于在这里使用monadic形式,因为我想在这里“免费”验证失败的情况下重新创建用户输入。它会以这种方式工作吗?

1 个答案:

答案 0 :(得分:1)

liftwidgetToPageContent

一起使用
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)