代码之家  ›  专栏  ›  技术社区  ›  markhorrocks

如何为具有公共部分的多个模型呈现模板

  •  0
  • markhorrocks  · 技术社区  · 6 年前

    在我的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 回复  |  直到 6 年前
        1
  •  1
  •   ramrunner    6 年前

    仅仅一个简单的解决方案是:

    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(),然后继续为每个模板调用查找和执行模板步骤。

    进一步考虑这个想法,我将创建一个新的类型,它将嵌入一个模板(或一片模板),并由页眉和页脚进行注释。

    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。