Как визуализировать шаблоны для нескольких моделей с общими частями - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть много моделей в моем проекте 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 Ответ

0 голосов
/ 02 февраля 2019

просто базовое решение было бы следующим:

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
}

и, конечно, вы можете превратить встраивание этой структуры в полноценное поле [] Template, чтобы сделать несколькоExecuteTemplates между верхним и нижним колонтитулами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...