How to assign variables of go template inside go template?

PHPz
Release: 2024-02-05 22:12:07
forward
1089 people have browsed it

How to assign variables of go template inside go template?

问题内容

我刚刚开始使用 golang 和模板系统来重新开发我的网络服务器。现在我只想为每个网站编写常量变量,但我什至不知道我在搜索什么。希望有人能帮忙。

我有这个 gohtml 文件作为每个 html 文件的“基础”

    {{define "topdoc"}}
    <!doctype html>
    <html lang="en" data-bs-theme="dark">
    <head>
        <meta charset="utf-8">
        <meta http-equiv="x-ua-compatible" content="ie=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>{{.title}}</title>
        <!-- bootstrap -->
        <link href="https://cdn.jsdelivr.net/npm/[email&#160;protected]/dist/css/bootstrap.min.css" rel="stylesheet"
              integrity="sha384-kk94chflle+ny2dmcwgmq91rcga5gtu4mk92hdvye+m/sxh301p5ily+dn9+njoz"
              crossorigin="anonymous">
    </head>
    <body>
{{end}}

{{define "botdoc"}}
    <script src="https://cdn.jsdelivr.net/npm/[email&#160;protected]/dist/js/bootstrap.bundle.min.js"
            integrity="sha384-enjdo4dr2bkbifxqpeotz1hicje39wm4jdkdf19u8gi4ddq3gyns7ntkfadvqsze"
            crossorigin="anonymous"></script>
    </body>
    </html>
{{end}}
Copy after login

我想更改标题,然后以相同的方式更改例如元数据描述和类似的内容。

{{template "topdoc" .}}
{{template "navbar"}}
home

{{template "botdoc"}}
Copy after login

导航栏在另一个文件中定义。

现在我想在这个文件中给出变量

{{template "topdoc" .title="home" .otherparam="checking..."}}
{{template "navbar"}}
home

{{template "botdoc"}}
Copy after login

也许有人可以帮助我解决这个非常琐碎的问题。

当我使用这个方法时

{{define "title"}}home{{end}}
{{template "topdoc"}}
{{template "navbar"}}
home

{{template "botdoc"}}
Copy after login

首先加载基本文件,它显示一个空白网站。

我像这样加载模板文件:

func main() {
    r := gin.Default()

    tmpl = make(map[string]*template.Template)

    // Load templates files
    templateFiles := []string{}

    fmt.Println("Loading templates...")
    // Walk through the "templates" folder and all its subdirectories
    nerr := filepath.Walk("main/web/assets/templates", func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }

        // Check if the file is an HTML templates
        if !info.IsDir() && strings.HasSuffix(info.Name(), ".gohtml") {
            // Replace backslashes with forward slashes (for Windows compatibility)
            templateName := strings.Replace(path, "\\", "/", -1)

            // Parse the file and add it to the "tmpl" map
            templateFiles = append(templateFiles, path)

            //console log
            fmt.Print(templateName + " ")
        }
        return nil
    })

    if nerr != nil {
        panic(nerr)
    }

    fmt.Println("\n\nLoading sites...")

    // Walk through the "public" folder and all its subdirectories
    err := filepath.Walk("main/web/public", func(path string, info os.FileInfo, err error) error {
        if err != nil {
            return err
        }

        // Check if the file is an HTML templates
        if !info.IsDir() && strings.HasSuffix(info.Name(), ".gohtml") {
            // Get the directory path (relative to the "public" folder)
            relPath, err := filepath.Rel("main/web/public", filepath.Dir(path))
            if err != nil {
                return err
            }
            // Replace backslashes with forward slashes (for Windows compatibility)
            templateName := strings.Replace(relPath, "\\", "/", -1)

            // Parse the file and add it to the "tmpl" map
            parsing := []string{}
            parsing = append(parsing, templateFiles...)
            parsing = append(parsing, path)

            fmt.Println(parsing)

            tmpl[templateName] = template.Must(template.ParseFiles(parsing...))

            // If the path is empty, default to "index"
            if templateName == "." {
                templateName = ""
            }

            // Register the templates with the appropriate route
            r.GET("/"+templateName, handler)
        }

        return nil
    })
    if err != nil {
        panic(err)
    }

    r.Run()
}
Copy after login


正确答案


这通常是使用模板组合来实现的。在您的“topdoc”模板中,只需调用其他模板即可:

{{define "topdoc"}}
...
{{template "title"}}
...
{{end}}
Copy after login

并将“标题”模板定义为

{{define "title"}}default title{{end}}
Copy after login

然后,您可以通过在单独的文件中重新定义“标题”模板来覆盖它:

{{define "title"}}New title{{end}}
{{define "someTemplate}}
{{template "topdoc"}}
...
{{end}}
Copy after login

您必须编写这些不同的模板文件,以便首先加载“topdoc”(定义默认的“标题”),然后加载重新定义“标题”的模板。

The above is the detailed content of How to assign variables of go template inside go template?. For more information, please follow other related articles on the PHP Chinese website!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template