GoLang динамическая генерация шаблона


GoLang шаблонизатор html/template

Парсинг несокльких шаблонов в один (#multiple Parse Go template)

Создадим структурку основного шаблона, назовём её main, внутрь будет вставляться шаблон index

var mainLayoutTmpl = {{define "main" }} {{ template "index" . }} {{ end }}

Определим слайс с файлами которые будем парсить:

tplFiles := []string{"./src/www/layout/index.html", "./src/www/blocks/header.html", "./src/www/blocks/left_side.html", "./src/www/blocks/footer.html"}

Объявим слайс в который будем складывать блоки шаблона content

var blocks_contentTmpl = []string{"{{define \"content\"}}"}

Допустим структура шаблона content достаётся из БД и имеет вид:

contTpls := map[int]string{1:"block_1", 2:"block_2"}

в цикле добавляем блоки к шаблону content, и добавляем файлы с содержимым в слайс для парсинга tplFiles

for i := 1; i <= len(blocks); i++ {
var block_name = blocks[strconv.Itoa(i)].(string)
blocks_contentTmpl= append(blocks_contentTmpl, strings.Join([]string{{{template ", block_name, ."}}}, "")) // добавляем шаблоны в контент
tplFiles = append(tplFiles, strings.Join([]string{"./src/www/blocks/", block_name, ".html"}, "")) //добавляем файл в слайс для парсинга
}
blocks_contentTmpl = append(blocks_contentTmpl, "{{end}}") // закрывае content

Преобразуме слайс blocks_contentTmpl в строку, объявим, и распарсим шаблон

str_contentTpl := strings.Join(contTpls, " ")
mainTemplate := template.New("main") // объявим шаблон main
mainTemplate, _ = mainTemplate.Parse(mainLayoutTmpl) // парсим основном шаблон main
mainTemplate, _ = mainTemplate.Parse(str_contentTpl) // парсим шаблон content
mainTemplate, _ = mainTemplate.ParseFiles(tplFiles...) // парсим файлы

При каждом вызове Parse/ParseFile в контексте одно шаблона (mainTemplate) данные будут добавлятся в дерево.
Осталось выполнить шаблон и отправить его на вывод (к примеру в http.ResponseWriter) или сохранить в строку

bufer := new(bytes.Buffer) // объявляем буфер куда поместим готовый шаблон в виде строки
mainTemplate.ExecuteTemplate(bufer, "main", nil) // рендерим шаблон, и записываем его в bufer
mainTemplateString := bufer.String() // преобразуме содержимое буфера в строку
fmt.Printf("", mainTemplateStringx) // выведем строку шаблона в консоль

Comments 0