Yesodを使ってみて混乱したのがどこまでがHamletの構文でどこからがYesodの拡張なのだろうかというあたり。
WidgetsはYesodで追加された仕組みで、whamletとか^{footer}といった記法もYesodのものだと理解した。ついでにCore見て確認しておいた。
{-# LANGUAGE OverloadedStrings, TypeFamilies, TemplateHaskell,
QuasiQuotes, MultiParamTypeClasses #-}
import Yesod
data Messages = Messages
mkYesod "Messages" [parseRoutes|
/ RootR GET
/set-message SetMessageR POST
|]
instance Yesod Messages where
defaultLayout widget = do
pc <- widgetToPageContent widget
mmsg <- getMessage
hamletToRepHtml [hamlet|
$doctype 5
<html>
<head>
<title>#{pageTitle pc}
^{pageHead pc}
<body>
$maybe msg <- mmsg
<p>Your message was: #{msg}
^{pageBody pc}
|]
instance RenderMessage Messages FormMessage where
renderMessage _ _ = defaultFormMessage
getRootR :: Handler RepHtml
getRootR = defaultLayout $ do
setTitle "My Page Title"
toWidget [lucius| p { color: red; } |]
toWidgetHead [hamlet| <meta name=keywords content="session sample">|]
[whamlet|
<form method=post action=@{SetMessageR}>
My Message is: #
<input type=text name=message>
<input type=submit>
|]
postSetMessageR :: Handler ()
postSetMessageR = do
msg <- runInputPost $ ireq textField "message"
setMessage $ toHtml msg
redirect RootR
main :: IO ()
main = warpDebug 3000 Messages
Wisgetsのようにjs,css,htmlをまとめて管理できる仕組みはいいかもと思う反面、デザイナーとの分業って難しくなるんじゃないのかなぁと思うんだけどどうなんだろ?僕の場合は全部独りでやるからこういう仕組みのほうがあってるかなと思うんだけど。
それからcssの設定とか競合しないもんかね?