1

我正在使用 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

我确实尝试使用serveDirectoryon archives。像人们期望的那样请求example.com/bar.com/2012/03/请求,这在某些情况下很好。archives/bar.com/2012/03/index.html我希望能够使用一些已编译的拼接或Charade,以便在无法复制原始内容时页面看起来不会那么空(通常是因为它来自早已被遗忘的数据库)。

也许为此目的制作一个单独的 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
        }

(PS 我有一个类似但不相关的项目,允许用户自定义他们自己的“站点”的外观。目前,自定义仅限于图像和 CSS。如果上述问题的解决方案可以用于允许自定义布局模板每个用户,那就太好了。如果没有,不用担心。)

4

2 回答 2

0

您可能需要进行一些手动接线才能使其以您想要的方式工作,但是您可以使用一些帮助程序。首先是addTemplatesAt函数,可让您在 HeistState 中包含外部模板。您可以将其与您自己的 serveDirectory 路由结合使用来提供静态资源。一旦你为一个案例工作,我相信你将能够找到一种方法将两者结合在一个抽象中,这样你就可以很容易地添加你网站以前外观的多个版本。

于 2014-03-08T18:26:55.627 回答
0

这是我最终为我的主要用例得出的详细解决方案:

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")
    ]
于 2014-03-09T13:05:52.443 回答