我刚刚开始使用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/bootstrap@5.3.0-alpha3/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/bootstrap@5.3.0-alpha3/dist/js/bootstrap.bundle.min.js"
integrity="sha384-ENjdO4Dr2bkBIFxQpeoTz1HIcje39Wm4jDKdf19U8gI4ddQ3GYNS7NTKfAdVQSZe"
crossorigin="anonymous"></script>
</body>
</html>
{{end}}
然后我想改变标题和稍后的例子 meta数据描述和类似的东西一样的方式。
{{template "topdoc" .}}
{{template "navbar"}}
HOME
{{template "botdoc"}}
导航栏在另一个文件中定义。
现在我想给予这个文件中的变量
{{template "topdoc" .title="Home" .otherParam="Checking..."}}
{{template "navbar"}}
HOME
{{template "botdoc"}}
也许有人能帮我解决这个微不足道的问题。
当我用这个方法的时候
{{define "title"}}Home{{end}}
{{template "topdoc"}}
{{template "navbar"}}
HOME
{{template "botdoc"}}
并先加载基础文件,它显示一个空白的网站。
我像这样加载模板文件:
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()
}
2条答案
按热度按时间aurhwmvo1#
这通常使用模板组合来实现。在您的“topdoc”模板中,只需调用其他模板:
并将“title”模板定义为
然后,您可以在单独的文件中重新定义“title”模板:
您必须组合这些不同的模板文件,以便您首先加载“topdoc”(定义默认的“title”),然后加载重新定义“title”的模板。
pdtvr36n2#
为了在go模板中使用“常量”,最简单的方法就是使用模板来定义它们。因此,首先加载基础模板文件是非常重要的,这样它就可以被重写。当这样做时,定义一个“内容”模板很重要,这样就可以显示实际的网站。
所以基地golang看起来会是这样
网站文件应该是这样的