Как визуализировать шаблоны для нескольких моделей с общими частями
У меня есть много моделей в моем проекте golang с представлениями CRUD, и я хочу отобразить их с общими верхними и нижними колонтитулами, но не могу понять, как это сделать. Примеры, которые я видел, слишком упрощены.
Предположим, у меня есть такая структура шаблона:
templates
- layouts
- header.tmpl
- footer.tmpl
- users
- index.tmpl
- new.tmpl
- edit.tmpl
- show.tmpl
- venues
- index.tmpl
- new.tmpl
- edit.tmpl
- show.tmpl
Как отобразить эти шаблоны для указанной модели с общим верхним и нижним колонтитулами?
1 ответ
Просто простое решение будет следующим:
package main
import (
"fmt"
"os"
"text/template"
)
func main() {
//read in one go the header, footer and all your other tmpls.
//append to that slice every time the relevant content that you want rendered.
alltmpls := []string{"./layouts/header.tmpl", "./layouts/footer.tmpl", "./users/index.tmpl"}
templates, err := template.ParseFiles(alltmpls...)
t := templates.Lookup("header.tmpl")
t.ExecuteTemplate(os.Stdout, "header", nil)
t = templates.Lookup("index.tmpl")
t.ExecuteTemplate(os.Stdout, "index", nil)
t = templates.Lookup("footer.tmpl")
t.ExecuteTemplate(os.Stdout, "footer", nil)
}
на самом деле вам нужна функция, которая возвращает фрагмент соответствующих файлов для заполнения переменной alltmpls. Он должен просканировать ваши каталоги и получить оттуда все файлы для передачи в ParseFiles(), а затем перейти к вызовам шагов Lookup и ExecuteTemplate для каждого шаблона.
Продолжая эту идею, я бы создал новый тип, который бы встраивал шаблон (или часть шаблонов) для аннотирования верхним и нижним колонтитулами.
type hftemplate struct {
template.Template
header, footer *template.Template
}
func (h *hftemplate) ExecuteTemplate(wr io.Writer, name string, data interface{}) error {
h.header.ExecuteTemplate(wr, "header", nil)
err := h.ExecuteTemplate(wr, name, data)
h.footer.ExecuteTemplate(wr, "footer", nil)
return err
}
и, конечно, вы можете превратить встраивание этой структуры в полноценное поле шаблона [], чтобы сделать несколько шаблонов ExecuteTemplate s между верхним и нижним колонтитулами.