Я реализую форму «свяжитесь со мной», которая отправит электронное письмо при отправке. Мне нужна была эта форма для создания пользовательского HTML, поэтому в итоге я использовал монадические формы. Проблема в том, что я не знаю, как использовать монадическую форму.
код ниже. Для краткости я опустил часть, которая отправляет электронную почту. проблема в том, что моя форма никогда не проверяется правильно. результат формы никогда не будет FormSuccess
в моей функции postContactR
.
Кажется, я неправильно инициализирую форму, когда вызываю runFormPost
внутри postContactR
. Я всегда передаю Nothing
вместо фактического ContactData
в contactForm
и не знаю, как составить ContactData
из запроса. Правильно ли я понимаю проблему? Я пытаюсь работать с плохо документированными функциями. :)
любая помощь?
РЕДАКТИРОВАТЬ: что выглядит странно, так это то, что ошибки проверки отображаются в форме, если я отправляю недопустимую форму, поэтому данные запроса в какой-то момент считываются. что не работает, так это то, что когда нет ошибок, я не перенаправляюсь на RootR
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE TemplateHaskell #-}
module Handler.Contact where
import Control.Applicative ((<$>), (<*>))
import Data.Text (Text)
import Foundation
import Network.Mail.Mime
data ContactData = ContactData
{ contactName :: Text
, contactEmail :: Text
, contactMessage :: Textarea
}
deriving Show
contactForm d = \html -> do
(r1, v1) <- mreq textField "Your name:" (contactName <$> d)
(r2, v2) <- mreq emailField "Your e-mail:" (contactEmail <$> d)
(r3, v3) <- mreq textareaField "Message:" (contactMessage <$> d)
let views = [v1, v2, v3]
return (ContactData <$> r1 <*> r2 <*> r3, $(widgetFile "contact-form"))
getContactR :: Handler RepHtml
getContactR = do
((_, form), _) <- runFormPost (contactForm Nothing)
defaultLayout $ do
setTitle "contact"
addWidget $(widgetFile "contact")
postContactR :: Handler RepHtml
postContactR = do
((r, form), _) <- runFormPost (contactForm Nothing)
case r of
FormSuccess d -> do
sendEmail d
setMessage "Message sent"
redirect RedirectTemporary RootR
_ -> getContactR