2014-03-07 1 views
1

Я использую Snap для создания довольно простого портфеля, который по большей части просто хранит материал в базе данных и показывает его пользователю. Одна из особенностей, которые я хотел бы иметь, - это способность демонстрировать отставку для моего портфолио. Каждый дизайн был бы не более чем одним шаблоном и множеством активов (изображения, css и т. Д.). В организационных целях я хотел бы объединить все элементы единого дизайна и отдельно от шаблонов/активов для моего портфолио.Рендеринг шаблонов с помощью Heist за пределами каталога шаблонов

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 

я попробовать использовать serveDirectory на archives. Запрашивая example.com/bar.com/2012/03/ запросов archives/bar.com/2012/03/index.html, как и следовало ожидать, и это нормально для некоторых случаев. Я хотел бы иметь возможность использовать некоторые скомпилированные сращивания или Charade, чтобы страница выглядела не такой пустой, когда исходный контент не мог быть реплицирован (обычно потому, что он исходил из давно забытой базы данных).

Возможно, для этого имеет смысл сделать отдельный щелчок для этой цели? Если да, то как мне это сделать? Для справки, 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.Если решение этой проблемы можно было бы использовать, чтобы разрешить настройку шаблона макета для каждого пользователя, это было бы здорово. Если нет, не беспокойтесь.)

ответ

0

Возможно, вам придется сделать несколько руководств чтобы заставить это работать так, как вы хотите, но есть некоторые помощники, которые вы можете использовать. Сначала есть функция addTemplatesAt, которая позволяет включать внешние шаблоны в ваш HeistState. Вы можете использовать это в сочетании со своими собственными маршрутами serveDirectory для обслуживания статических ресурсов. Как только вы заработаете для одного случая, я уверен, что вы сможете найти способ объединить эти два абстракции, что позволит вам легко добавить несколько версий предыдущего взгляда вашего сайта.

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

 Смежные вопросы

  • Нет связанных вопросов^_^