3

フォルダー内のウォークを使用してファイルを動的に解析しようとしていますが、ファイル「path/file.html」のパスを設定できるようにしたいと考えています。ExecuteTemplateしかし、私の問題は、フォルダー「path/folder/files.html」にファイルがある場合、ファイル名が同じ「files.html」になるため、実行できないことです。各テンプレートに I ParseFiles という名前を付けることはできますか?

一度にすべてを実行しようとしてもうまくいかない場合は、ファイルを 1 つずつ実行しても問題ありません。

// Parse file and send to responsewriter
func View(w http.ResponseWriter, path string) {
    temp, err := template.ParseFiles("application/views/"+path+".html")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    } else {
        temp.ExecuteTemplate(w, path, nil)
    }
}
4

2 に答える 2

3

完全なファイル パスを名前として使用してテンプレートを作成するメソッドをfilepath.Walk使用して、ファイル システムをウォークします。consumer

package main

import (
    "fmt"
    "html/template"
    "os"
    "path/filepath"
)

func consumer(p string, i os.FileInfo, e error) error {
    t := template.New(p)
    fmt.Println(t.Name())
    return nil
}

func main() {
    filepath.Walk("/path/to/template/root", filepath.WalkFunc(consumer))
}
于 2012-09-14T21:47:27.237 に答える
0

template.Lookup を試すことができます。プロセス全体は次のようになります。

var (
   templates *template.Template 
)

func loadTemplate() {
    funcMap := template.FuncMap{        
        "safe":func(s string) template.HTML {
            return template.HTML(s)
        },
    }
    var err error
    templates, err = utils.BuildTemplate("/theme/path/", funcMap)
    if err != nil {
        log.Printf("Can't read template file %v,", err)
    }   
 }
func homeHandler(w http.ResponseWriter, r *http.Request) {  
        //lookup the theme your want to use
    templ = templates.Lookup("theme.html")
    err := templ.Execute(w, data)
    if err != nil {
        log.Println(err)
    }
 }

 func main() {
   loadTemplate()
 }

BuildTemplate は次のようになります。

func BuildTemplate(dir string, funcMap template.FuncMap) (*template.Template, error) {
    fs, err := ioutil.ReadDir(dir)
    if err != nil {
        fmt.Printf("Can't read template folder: %s\n", dir)
        return nil, err
    }
    files := make([]string, len(fs))
    for i, f := range (fs) {
        files[i] = path.Join(dir, f.Name())
    }
    return template.Must(template.New("Template").Funcs(funcMap).ParseFiles(files...)), nil
}
于 2013-02-10T10:32:52.457 に答える