送信時にメールを送信する「連絡先」フォームを実装しています。カスタム HTML を発行するにはこのフォームが必要だったので、モナディック フォームを使用することになりました。問題は、モナド形式の使い方がわからないことです。
コードは以下です。簡潔にするために、電子メールを送信する部分は省略しました。問題は、フォームが正しく検証されないことです。フォームの結果がFormSuccess
私のpostContactR
関数に含まれることはありません。
runFormPost
内部で呼び出すと、フォームが正しく初期化されないようですpostContactR
。Nothing
私は常に実際のContactData
toの代わりに渡しますが、リクエストからcontactForm
my を構築する方法がわかりません。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