From f5adec31c65f562f8d79871d724bf7a9163173dc Mon Sep 17 00:00:00 2001 From: JessonChan Date: Fri, 4 Mar 2016 14:49:16 +0800 Subject: [PATCH] improve the template reader function --- controller.go | 68 ++++++++++++++------------------------------------- template.go | 14 ++++++++--- 2 files changed, 30 insertions(+), 52 deletions(-) diff --git a/controller.go b/controller.go index 54da81ec..372d8c0f 100644 --- a/controller.go +++ b/controller.go @@ -197,35 +197,9 @@ func (c *Controller) RenderString() (string, error) { // RenderBytes returns the bytes of rendered template string. Do not send out response. func (c *Controller) RenderBytes() ([]byte, error) { - //if the controller has set layout, then first get the tplname's content set the content to the layout - var buf bytes.Buffer - var err error - if c.Layout != "" { - if c.TplName == "" { - c.TplName = strings.ToLower(c.controllerName) + "/" + strings.ToLower(c.actionName) + "." + c.TplExt - } - - if BConfig.RunMode == DEV { - buildFiles := []string{c.TplName} - if c.LayoutSections != nil { - for _, sectionTpl := range c.LayoutSections { - if sectionTpl == "" { - continue - } - buildFiles = append(buildFiles, sectionTpl) - } - } - BuildTemplate(BConfig.WebConfig.ViewsPath, buildFiles...) - } - if t := getTemplateByName(c.TplName); t == nil { - panic("can't find templatefile in the path:" + c.TplName) - } else { - err = t.ExecuteTemplate(&buf, c.TplName, c.Data) - if err != nil { - Trace("template Execute err:", err) - return nil, err - } - } + buf, err := c.renderTemplate() + //if the controller has set layout, then first get the tplName's content set the content to the layout + if err == nil && c.Layout != "" { c.Data["LayoutContent"] = template.HTML(buf.String()) if c.LayoutSections != nil { @@ -234,11 +208,9 @@ func (c *Controller) RenderBytes() ([]byte, error) { c.Data[sectionName] = "" continue } - buf.Reset() - err = getTemplateByName(sectionTpl).ExecuteTemplate(&buf, sectionTpl, c.Data) + err = executeTemplate(&buf, sectionTpl, c.Data) if err != nil { - Trace("template Execute err:", err) return nil, err } c.Data[sectionName] = template.HTML(buf.String()) @@ -246,31 +218,29 @@ func (c *Controller) RenderBytes() ([]byte, error) { } buf.Reset() - err = getTemplateByName(c.Layout).ExecuteTemplate(&buf, c.Layout, c.Data) - if err != nil { - Trace("template Execute err:", err) - return nil, err - } - return buf.Bytes(), nil + executeTemplate(&buf, c.Layout, c.Data) } + return buf.Bytes(), err +} +func (c *Controller) renderTemplate() (bytes.Buffer, error) { + var buf bytes.Buffer if c.TplName == "" { c.TplName = strings.ToLower(c.controllerName) + "/" + strings.ToLower(c.actionName) + "." + c.TplExt } if BConfig.RunMode == DEV { - BuildTemplate(BConfig.WebConfig.ViewsPath, c.TplName) - } - if t := getTemplateByName(c.TplName); t == nil { - panic("can't find templatefile in the path:" + c.TplName) - } else { - buf.Reset() - err = t.ExecuteTemplate(&buf, c.TplName, c.Data) - if err != nil { - Trace("template Execute err:", err) - return nil, err + buildFiles := []string{c.TplName} + if c.Layout != "" && c.LayoutSections != nil { + for _, sectionTpl := range c.LayoutSections { + if sectionTpl == "" { + continue + } + buildFiles = append(buildFiles, sectionTpl) + } } + BuildTemplate(BConfig.WebConfig.ViewsPath, buildFiles...) } - return buf.Bytes(), nil + return buf, executeTemplate(&buf, c.TplName, c.Data) } // Redirect sends the redirection response to url with status code. diff --git a/template.go b/template.go index da79d383..e6c43f87 100644 --- a/template.go +++ b/template.go @@ -18,6 +18,7 @@ import ( "errors" "fmt" "html/template" + "io" "io/ioutil" "os" "path/filepath" @@ -37,12 +38,19 @@ var ( beeTemplateExt = []string{"tpl", "html"} ) -func getTemplateByName(name string) *template.Template { - if BConfig.RunMode == "dev" { +func executeTemplate(wr io.Writer, name string, data interface{}) error { + if BConfig.RunMode == DEV { templatesLock.RLock() defer templatesLock.RUnlock() } - return beeTemplates[name] + if t, ok := beeTemplates[name]; ok { + err := t.ExecuteTemplate(wr, name, data) + if err != nil { + Trace("template Execute err:", err) + } + return err + } + panic("can't find templatefile in the path:" + name) } func init() {