2017-05-06 13 views
1

私はちょうどGoを使い始めています。私はそれを使ってWebアプリケーションを作成したいと思います。今私がしようとしているのは、ハンドルバーのような形でテンプレートを使用することです。ヘッダーとフッターをメインページから抜き出して、すべてのWebページに挿入できるようにしたい。GoLangの部分的なHTML

私の現在の設定では、ホームページ、ヘッダー、フッターのHTMLファイルを解析してキャッシュすることになっています。次に、私のhome.htmlテンプレートを実行します。このテンプレートには、Title、header.html、およびfooter.htmlの各ページのフィールドがあります。

類似のページを検索するたびに、javascriptページが表示されるので、これが再投稿の場合は、どこを見てくださいか教えてください。

編集: @Mintyと@putuの回答からヒントを得るためにコードを更新しました。私はhtmlファイルを読み込んでデータマップに保存しようとしていますが、テンプレートdefineもテンプレートに追加しています。いくつかの新しいバグがありますが、私はスカッシュをしていますので、サイトは現在レンダリングされていません。しかし、あなたが与えることができる新しいヒントがあれば、それは多くの助けになります。

server.go

package main 

import (
    "html/template" 
    "io/ioutil" 
    "net/http" 
    "regexp" 
) 

var tPath = "./temps/" 
var dPath = "./data/" 

var templates = template.Must(template.ParseFiles(tPath+"home.html", dPath+"header.html", dPath+"footer.html")) 
var validPath = regexp.MustCompile("^/") 

func rootHandler(wr http.ResponseWriter, req *http.Request) { 
    title := "home" 
    headerFile, headErr := ioutil.ReadFile(dPath + "header.html") 
    footerFile, footErr := ioutil.ReadFile(dPath + "footer.html") 

    if headErr != nil || footErr != nil { 
     http.Error(wr, headErr.Error(), http.StatusInternalServerError) 
     http.Error(wr, footErr.Error(), http.StatusInternalServerError) 
    } 

    data := map[string]interface{}{ 
     "Title": title, 
     "Header": string(headerFile), 
     "Footer": string(footerFile), 
    } 

    err := templates.ExecuteTemplate(wr, title+".html", data) 

    if err != nil { 
     http.Error(wr, err.Error(), http.StatusInternalServerError) 
    } 
} 

func main() { 
    http.HandleFunc("/", rootHandler) 
    http.ListenAndServe(":8080", nil) 
} 

home.html:

{{define "homeHTML"}} 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8"> 
     <title>{{.Title}} - MySite</title> 
     <link rel="stylesheet" type="text/css" href="style.css"> 
    </head> 
    <body> 
     {{.Header}} 
     <h1>Welcome!</h1> 
     {{.Footer}} 
    </body> 
</html> 
{{end}} 

Header.html:

{{define "headerHTML"}} 
<header> 
    <h1>MySite</h1> 
    <br> 
    <nav> 
     <a href="/">Home</a> 
    </nav> 
</header> 
{{end}} 

Footer.html

{{define "footerHTML"}} 
<footer> 
    <p>Thank You for Visiting</p> 
</footer> 
{{end}} 
+1

のようになります。ちょうどコピーを正しく貼り付けると動作します – Minty

答えて

2

これは完全な動作例です。

// home.html inside temps folder 
{{define "homeHTML"}} 

{{template "headHTML" .}} 

{{template "headerHTML" .}} 

{{template "footerHTML" .}} 

{{end}} 

// head.html inside data folder 
{{define "headHTML"}} 
<!DOCTYPE html> 
<html> 
    <head> 
     <meta charset="utf-8"> 
     <title>{{.title}} - MySite</title> 
     <link rel="stylesheet" type="text/css" href="style.css"> 
    </head> 
{{end}} 

// header.html inside data folder 
{{define "headerHTML"}} 
<header> 
    {{.header}} 
    <h1>Welcome to my site!</h1> 
    <br> 
    <nav> 
     <a href="/">Home</a> 
    </nav> 
</header> 
{{end}} 


// footer.html inside data folder 
{{define "footerHTML"}} 
<h1>Welcome! {{.footer}}</h1> 
<footer> 
<p>Thank You for Visiting</p> 
</footer> 
</body> 
</html> 
{{end}} 

とコードは、私の新しいソリューション、その完全な作業例を確認し、この

package main 

import (
    "html/template" 
    "io/ioutil" 
    "net/http" 
    "path/filepath" 
    "strings" 
) 

var tPath = "./temps/" 
var dPath = "./data/" 

var templateDirs = []string{"temps", "data"} 
var templates *template.Template 

func getTemplates() (templates *template.Template, err error) { 
    var allFiles []string 
    for _, dir := range templateDirs { 
     files2, _ := ioutil.ReadDir(dir) 
     for _, file := range files2 { 
      filename := file.Name() 
      if strings.HasSuffix(filename, ".html") { 
       filePath := filepath.Join(dir, filename) 
       allFiles = append(allFiles, filePath) 
      } 
     } 
    } 

    templates, err = template.New("").ParseFiles(allFiles...) 
    return 
} 

func init() { 
    templates, _ = getTemplates() 
} 

func rootHandler(wr http.ResponseWriter, req *http.Request) { 
    title := "home" 

    data := map[string]interface{}{ 
     "title": title, 
     "header": "My Header", 
     "footer": "My Footer", 
    } 

    err := templates.ExecuteTemplate(wr, "homeHTML", data) 

    if err != nil { 
     http.Error(wr, err.Error(), http.StatusInternalServerError) 
    } 
} 

func main() { 
    http.HandleFunc("/", rootHandler) 
    http.ListenAndServe(":8080", nil) 
} 
+0

素晴らしい作品です!ありがとう!!! – zgangwer20

1

structまたはmapというデータをテンプレートに渡す必要があります。 mapを使用してrootHandlerの例:詳細について

func rootHandler(wr http.ResponseWriter, req *http.Request) { 
    title := "home" 
    //Wrap your variable into a map 
    data := map[string]interface{}{ 
     "Title": title, 
     "IntVar": 100, 
    } 

    err := templates.ExecuteTemplate(wr, title+".html", data) 

    //other codes... 
} 

documentationを参照してください。

関連する問題