Работа с маршрутами и HTML (Heist) в Snap

У меня есть шаблоны (*.tpl) в my-snap-app/snaplets/heist/templates (main.tpl, page1.tpl, page2.tpl, page3.tpl). А вот мой Main.hs:

import Snap.Http.Server
import Snap.Core
import Snap.Snaplet
import Snap.Snaplet.Heist
import Snap.Util.FileServe
import Snap.Util.GZip
import Heist.Interpreted
import Heist

--.......

data App = App { _heist :: Snaplet (Heist App) }
makeLenses ''App

instance HasHeist App where 
  heistLens = subSnaplet heist

Как я могу:

а) Сделать все шаблоны доступными в моем веб-приложении? То есть я хочу иметь доступ page1.tpl, page2.tpl, page3.tpl на localhost://page1, localhost://page2, localhost://page3, Должен ли я обязательно добавлять маршрут для каждой страницы или я могу добавить маршрут, чтобы сделать их доступными сразу?

2) main.tpl это основной шаблон (макет). Как я могу сделать page[123] использование main.tpl в качестве основного шаблона макета?

1 ответ

Решение

Snaplet Heist имеет функцию serveHeist это очень похоже на serveDirectory, Это будет служить для всех шаблонов в шаблонах / на маршрутах. У пикши есть еще несколько деталей, например, скрытие определенных шаблонов, которые сами по себе не имеют смысла.

Для составления различных шаблонов думайте о шаблонах как о функциях - вы можете применять их к другим шаблонам, и в результате вы получите сам шаблон. Все это происходит в самом ограблении, а не в оснастке.

<apply> Тег выполняет функцию приложения. Аргументом является содержание внутри <apply> например, в page1.tpl:

<apply>
  <h1>I'm a function parameter</h1>
</apply>

Применяемая функция main.tpl и параметр <apply-content>:

<html><head></head>
  <body>
    <h1>Main template.</h1>
    <apply-content/>
  </body>
</html>

Использование <apply> а также <apply-content> выполнить функцию приложения и вычислить полную страницу, которая будет доступна на /page1 маршрут.

В руководстве по ограблению есть намного больше объяснений. Интересно, полезна ли аналогия функции-приложения для запоминания большего количества ограбления API.

Другие вопросы по тегам