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