我使用Snap创建了一个相当简单的组合,在大多数情况下,它只是将内容存储在数据库中,并将其显示给用户。我想要的功能之一是能够为我的投资组合展示退休的设计。每个设计都不过是一个模板和一个装满了资产(图像、css等)的工具。为了组织目的,我希望将属于单个设计的所有东西放在一起,并将其与我的投资组合的模板/资产分开。
src/Site.hs
static/images/logo.png
static/css/responsive.css
archives/foo.com/2012-03/index.html
archives/foo.com/2012-03/images/logo.png
archives/foo.com/2012-03/css/styles.css
archives/foo.com/2012-03/favicion.ico
archives/bar.com/2011-08/index.html
archives/bar.com/2011-08/images/logo.png
archives/bar.com/2011-08/css/styles.css
archives/bar.com/2011-08/favicion.ico我确实尝试过在archives上使用archives。如人们所期望的那样请求example.com/bar.com/2012/03/请求archives/bar.com/2012/03/index.html,这对某些实例来说是可以的。我希望能够使用一些编译好的剪接或猜字谜,这样当原始内容无法被复制时,页面就不会显得那么空(通常是因为它来自一个早已被遗忘的数据库)。
也许为这个目的做一个单独的snaplet更有意义?如果是的话,我该怎么做呢?作为参考,我的站点的snaplet是相当基本的,如下所示:
app :: SnapletInit App App
app = makeSnaplet "connex" "A snaplet for the connex site." Nothing $ do
h <- nestSnaplet "heist" heist $ heistInit' "templates" defaultHeistState
s <- nestSnaplet "session" sess $ initCookieSessionManager "config/site_key.txt" "session" (Just 86400)
d <- nestSnaplet "db" db pgsInit
addRoutes
[ ("/", indexH siteH)
-- more routes here
, ("", serveDirectory "static")
]
return $ App h s d
where
defaultHeistState = mempty {
hcInterpretedSplices = defaultInterpretedSplices,
hcLoadTimeSplices = defaultLoadTimeSplices
}(P.S.我有一个类似但不相关的项目,允许用户定制自己“站点”的外观。目前,定制仅限于图像和CSS。如果上述问题的解决方案可以用于为每个用户定制布局模板,那就太好了。如果没有,就不用担心。)
发布于 2014-03-08 18:26:55
您可能需要做一些手动布线,以使它以您想要的方式工作,但有一些帮助,您可以使用。首先,有一个addTemplatesAt函数,它允许您在HeistState中包含外部模板。您可以将其与您自己的serveDirectory路由结合使用,以服务静态资源。一旦您在一种情况下实现了这一点,我相信您将能够找到一种将两者结合在一个抽象中的方法,这样您就可以很容易地添加站点上一个外观的多个版本。
发布于 2014-03-09 13:05:52
下面是我的主要用例的详细解决方案:
app :: SnapletInit App App
app = makeSnaplet "app" "An snaplet example application." Nothing $ do
h <- nestSnaplet "heist" heist $ heistInit' "templates" defaultHeistState
s <- nestSnaplet "sess" sess $ initCookieSessionManager "site_key.txt" "sess" (Just 3600)
d <- nestSnaplet "db" db pgsInit
addRoutes routes
addTemplatesAt h "archives" "archives" -- added this
return $ App h s d
where
defaultHeistState = mempty
{ hcInterpretedSplices = defaultInterpretedSplices
, hcLoadTimeSplices = defaultLoadTimeSplices
}为我的模板提供服务的处理程序看起来如下(非常类似于heistServe的样子):
archiveServe :: AppHandler ()
archiveServe = do
url <- withRequest (return . rqPathInfo)
let
splices = return ()
template = "archives/" <> url <> "index"
renderWithSplices template splices 我的路线:
designH = route
[ ("/", ifTop designIndexH)
, ("/archives/", archiveServe)
, ("/archives/", serveDirectory "archives")
]https://stackoverflow.com/questions/22258128
复制相似问题