2013-10-16 5 views
3

Impossible de trouver une solution à un problème simple, la réponse devrait être évidente. Comment rendre l'URL avec des paramètres de requête dans le template hamlet?URL de rendu avec paramètres de requête

I.e. @{ItemsR} va générer http://localhost:3000/items et comment puis-je générer quelque chose comme http://localhost:3000/items?page=10&sort=name?

+0

'ItemsR' devrait avoir des args, essayez' @ {ItemsR 10 " name "}' – josejuan

+0

Si je comprends bien, les arguments du gestionnaire proviennent des segments de chemin. – lambdas

+0

Oui, si vous souhaitez "args traditionnels" vous pouvez rendre votre url directement sur votre template (par exemple '' a href = @ {ItemsR}? Page =^{pageNumber} & ... '). Mais le routage est meilleur (typesafe). – josejuan

Répondre

2

Yesod est RESTful, vous devez utiliser des arguments au format url (par exemple /items/page/10/sortby/name) si vous souhaitez utiliser le format QueryString puis, vous perdez la gestion de l'URL sécurisée de type Yesod.

exemple ci-dessous montrent comment utiliser une représentation différente RESTful et une redirection (rendre une URL querystring) à un argument de lecture de la demande de querystring

{-# LANGUAGE QuasiQuotes #-} 
{-# LANGUAGE TypeFamilies #-} 
{-# LANGUAGE TemplateHaskell #-} 
{-# LANGUAGE OverloadedStrings #-} 
{-# LANGUAGE MultiParamTypeClasses #-} 
import Yesod 
import Data.Text 
import Network.Wai.Handler.Warp (run) 

data RouteTest = RouteTest 

mkYesod "RouteTest" [parseRoutes| 
/item/all/page/#Int/sortby/#Text Items1R GET 
/items/page/#Int/sortby/#Text Items2R GET 
/items/#Int/#Text Items3R GET 
/itemsquery ItemsQueryR GET 
|] 

instance Yesod RouteTest where 
    defaultLayout widget = do 
     pc <- widgetToPageContent widget 
     hamletToRepHtml [hamlet|\<!DOCTYPE html><html lang="en"><body>^{pageBody pc}</body></html>|] 

getItemsR :: Text -> Int -> Text -> HandlerT RouteTest IO Html 
getItemsR path page sortby = 
    defaultLayout [whamlet| 
    <h1>Items Page ##{page} sorted by #{sortby} 
    <h4>(Using #{path} path format) 
    <p>Same request in query string format 
     <a href="@{ItemsQueryR}?page=#{page}&sort=#{sortby}"> 
     here 
    |] 

getItems1R = getItemsR $ pack "large" 
getItems2R = getItemsR $ pack "medium" 
getItems3R = getItemsR $ pack "short" 

getItemsQueryR = do 
    req <- getRequest 
    defaultLayout [whamlet| 
    <h1>Query String arguments format 
    <ul> 
     $forall (k, v) <- reqGetParams req 
     <li> 
      <b>#{k}</b>: #{v} 
    |] 

main = run 8181 =<< toWaiApp RouteTest 

bien sûr, vous pouvez écrire une aide pour prendre un peu comme votre @{ItemsR page sortby}

renderItemsQueryR page sortby = hamletToRepHtml [hamlet|@{ItemsQueryR}?page=#{page}&sort=#{sortby}|] 

mais vous devez utiliser comme

... 
url <- renderItemsQueryR page sortby 
defaultLayout [whamlet| 
    ... 
    <a href=#{url}> 
    ... 
|] 

enfin, vous pouvez écrire autre aide pour rendre une URL querystring

renderQueryString path keyValues = do 
    let querystring = intercalate "&" $ map (\(k, v) -> concat [k, "=", v]) keyValues 
    hamletToRepHtml [hamlet|@{path}?#{querystring}|] 

alors, le renderItemsQueryR pourrait être écrit comme

renderItemsQueryR page sortby = renderQueryString ItemsQueryR [("page" , show page) 
                   ,("sortby", sortby )] 
Questions connexes