4

送信時にメールを送信する「連絡先」フォームを実装しています。カスタム HTML を発行するにはこのフォームが必要だったので、モナディック フォームを使用することになりました。問題は、モナド形式の使い方がわからないことです。

コードは以下です。簡潔にするために、電子メールを送信する部分は省略しました。問題は、フォームが正しく検証されないことです。フォームの結果がFormSuccess私のpostContactR関数に含まれることはありません。

runFormPost内部で呼び出すと、フォームが正しく初期化されないようですpostContactRNothing私は常に実際のContactDatatoの代わりに渡しますが、リクエストからcontactFormmy を構築する方法がわかりません。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

4

1 に答える 1

3

contact-form.hamlet に html 値を含めていますか? ナンス値です。r の値を (postContactR で) 出力すると、より良いデバッグ情報が得られます。

モナドフォームの例を追加するために TODO リストを書いていますが、すぐにアップするはずです。

于 2011-09-22T02:42:00.253 に答える