首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在模板目录之外用Heist呈现模板

在模板目录之外用Heist呈现模板
EN

Stack Overflow用户
提问于 2014-03-07 18:41:00
回答 2查看 99关注 0票数 1

我使用Snap创建了一个相当简单的组合,在大多数情况下,它只是将内容存储在数据库中,并将其显示给用户。我想要的功能之一是能够为我的投资组合展示退休的设计。每个设计都不过是一个模板和一个装满了资产(图像、css等)的工具。为了组织目的,我希望将属于单个设计的所有东西放在一起,并将其与我的投资组合的模板/资产分开。

代码语言:javascript
复制
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是相当基本的,如下所示:

代码语言:javascript
复制
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。如果上述问题的解决方案可以用于为每个用户定制布局模板,那就太好了。如果没有,就不用担心。)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-08 18:26:55

您可能需要做一些手动布线,以使它以您想要的方式工作,但有一些帮助,您可以使用。首先,有一个addTemplatesAt函数,它允许您在HeistState中包含外部模板。您可以将其与您自己的serveDirectory路由结合使用,以服务静态资源。一旦您在一种情况下实现了这一点,我相信您将能够找到一种将两者结合在一个抽象中的方法,这样您就可以很容易地添加站点上一个外观的多个版本。

票数 0
EN

Stack Overflow用户

发布于 2014-03-09 13:05:52

下面是我的主要用例的详细解决方案:

代码语言:javascript
复制
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的样子):

代码语言:javascript
复制
archiveServe :: AppHandler ()
archiveServe = do
    url <- withRequest (return . rqPathInfo)
    let
        splices = return ()
        template = "archives/" <> url <> "index"
    renderWithSplices template splices 

我的路线:

代码语言:javascript
复制
designH = route
    [ ("/", ifTop designIndexH)
    , ("/archives/", archiveServe)
    , ("/archives/", serveDirectory "archives")
    ]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22258128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档