【问题标题】:Creation of monadic yesod form without hamlet创建没有小村庄的一元yesod形式
【发布时间】:2016-08-10 21:58:47
【问题描述】:

我的目标是写一个不使用 hamlet 的单子 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)

在使用小村庄的情况下,它将是这样的:

let widget = do
  toWidget [whamlet|
            ^{fvInput nameV}
            ^{fvInput passV}
           |]

但是 fvInput 的返回类型是FieldView App,我需要将其转换为 Html 才能很好地与 blaze 组合。

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

【问题讨论】:

  • 你能告诉我userForm是什么类型吗?
  • 它是Maybe User -&gt; Html -&gt; MForm Handler (FormResult User, Widget)。第一个参数是我用来填充已存储数据的用户实例,第二个参数是extra 值。我对帖子示例进行了一些编辑。

标签: haskell yesod


【解决方案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)

【讨论】:

    猜你喜欢
    • 2015-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多