2

次のようなテンプレートのセットが与えられます。

layout.tpl

<html>
<head>
<title>Some title</title>
{{template extracss}}
</head>
<body>
<h1>Page title</h1>
{{template content .}}
</body>
</html>

home.tpl

{{define "content"}}
<p>page content goes here</p>
{{end}}

edit.tpl

{{define "content"}}
<form>form content goes here</form>
{{end}}

{{define "extracss"}}<style>body{background:pink}</style>{{end}}

これを使用してテンプレートをレンダリングします。

func Render(w http.ResponseWriter, tmpname string, data interface{}) {

    t, err := template.ParseFiles("views/layout.tpl", "views/"+tmpname+".tpl")
    // parse error
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }

    if err := t.Execute(w, data); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}

edit.tplは、「extracss」が定義されているため正しくレンダリングされますが、home.tplは、テンプレートパーサーが「そのようなテンプレート「extracss」はありません」と正しく言うようにはなりません。

では、「オプションの」テンプレートを使用できるようにするには、どのメカニズムを使用しますか?

何か案は?

4

2 に答える 2

3

空の定義は機能します:{{define "extracss"}}{{end}}。あまりエレガントではないかもしれませんが、理解するのは簡単です。

空の定義を繰り返す必要はないことに注意してください。それらをマスターテンプレートに入れ、必要な場合にのみ、含まれているテンプレートで再定義できます。

于 2013-03-25T14:28:08.267 に答える
0

@thomasからの回答は素晴らしいですが、彼が書いたものが曖昧で、コードに変換しようとして多くの時間を無駄にしていることに気づきました。

これが機能するコードです(そして私は彼が提案しているものだと信じています):

layout.tpl

<html>
  <head>
    <title>Some title</title>
    {{template extracss}}
    {{define "extracss"}}{{end}}
  </head>
  <body>
    <h1>Page title</h1>
    {{template content .}}
  </body>
</html>

home.tpl

{{define "content"}}
  <p>page content goes here</p>
{{end}}

edit.tpl

{{define "content"}}
  <form>form content goes here</form>
{{end}}

{{define "extracss"}}<style>body{background:pink}</style>{{end}}

これを使用してテンプレートをレンダリングします。

func Render(w http.ResponseWriter, tmpname string, data interface{}) {

    t, err := template.ParseFiles("views/layout.tpl", "views/"+tmpname+".tpl")
    // parse error
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
       
    if err := t.Execute(w, data); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}
于 2020-07-08T19:54:53.490 に答える