Создание монадической формы йесод без деревушки

Моя цель - написать монадическую форму 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, чтобы хорошо сочинять.

Возможно, для этой задачи будет проще использовать форму ввода (то есть реализовать формы без w/hamlet), но в документации по yesodbook сказано, что она неправильно обрабатывает неправильный случай ввода. Я склонен использовать монадическую форму здесь, так как я хочу воссоздать пользовательский ввод в случае неудачной проверки здесь "бесплатно". Будет ли это работать так?

1 ответ

Решение

Использование 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)
Другие вопросы по тегам