【问题标题】:Rendering templates with Heist outside of the templates directory在模板目录之外使用 Heist 渲染模板
【发布时间】:2014-04-11 01:47:41
【问题描述】:

我正在使用 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 上使用serveDirectory。正如人们所期望的那样,请求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。如果可以使用上述问题的解决方案来允许自定义每个用户的布局模板,那就太好了。如果没有,不用担心。)

【问题讨论】:

    标签: haskell-snap-framework heist


    【解决方案1】:

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

    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")
        ]
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-12-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-25
        • 1970-01-01
        • 2016-02-02
        相关资源
        最近更新 更多