2016-08-10 2 views
2

나는 햄릿 파트없이 yesod 응용 프로그램을 작성하려고합니다. 내 질문은 양식에 관한 것입니다 : Applicative를 사용하여 양식을 생성 할 수는 있지만 내 불꽃 코드에서 직접 사용할 수는 없습니다.Yesod에서 불꽃 코드로 위젯을 작성하는 방법은 무엇입니까?

-- actual form example 
userForm :: Form User 
userForm = renderDivs $ User 
    <$> areq textField "Login" Nothing 
-- usage example 
getPageR :: Handler Html 
getPageR = do 
    ((_, widget), enctype') <- runFormGet userForm 
    defaultLayout [whamlet| 
       <form method=post [email protected]{PageR} enctype=#{enctype'}> 
       ^{widget} -- This widget include. 
       <button>Submit|] 

그러나 내가 촌락없이 방법을 다시 작성할 수 있습니다 : 여기

는 마을 버전 예입니다?

getPageR = do 
    ((_, widget), enctype') <- runFormGet userForm 
    defaultLayout $ do 
    toWidgetBody $ \render -> do 
     H.div ! A.id "form" $ do 
     H.form ! A.method "post" ! A.action (action' render) ! A.enctype (enct' enctype) $ "" 
     -- widget include? 
     H.button "Submit!" 
    where 
    action' = \render -> toValue $! render (PageR) [] 
    enct' = toValue . renderHtml . toHtml 

Obvously, 불길 코드의 유형은 html로하지만, 사용자 정의 폼 유형은 위젯, 그래서 연결이되지 않는다 : 나의 현재 코드는 다음과 같다. 나는 toWidgetBody 기능 후에 위젯 만 추가 할 수 있지만 모든 내용이 끝나면 양식이 작성됩니다. hamlet ^{widget} 구조가없는 블레이즈 연결자 내에 양식을 포함시키는 방법이 있습니까 (HTML로 렌더링 할 수 있습니까?)?

답변

2

widgetToPageContent 기능을 사용하십시오.

그러면 pageBody을 호출하고 render 함수를 적용하여 Html에 도착합니다.

getPageR :: Handler Html -- same as: HandlerT App IO Html 
getPageR = do 
    ((_, widget), enctype') <- runFormGet sampleForm 
    content <- widgetToPageContent widget 
    defaultLayout $ do 
    toWidgetBody $ \render -> do 
     H.div ! A.id "form" $ do 
     H.form ! A.method "post" ! A.action (action' render) 
           ! A.enctype (enct' enctype') $ "" 
     pageBody content render 
     H.button "Submit!" 
    where 
    action' = \render -> toValue $! render (PageR) [] 
    enct' = toValue . renderHtml . toHtml 
    (!) = (H.!) 
    toValue = H.toValue 
+0

응용 프로그램 대신 모나드 양식을 사용하려는 경우 FieldView를 Html로 확장하여 위젯 정의에 사용할 수 있습니까? – Takao

+0

적절한 코드 예제를 사용하여 새로운 질문을 열어주십시오. - 감사합니다. – ErikR

관련 문제