improve the template reader function
This commit is contained in:
		
							parent
							
								
									6747c55a81
								
							
						
					
					
						commit
						f5adec31c6
					
				| @ -197,17 +197,40 @@ 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 | ||||
| 	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 { | ||||
| 			for sectionName, sectionTpl := range c.LayoutSections { | ||||
| 				if sectionTpl == "" { | ||||
| 					c.Data[sectionName] = "" | ||||
| 					continue | ||||
| 				} | ||||
| 				buf.Reset() | ||||
| 				err = executeTemplate(&buf, sectionTpl, c.Data) | ||||
| 				if err != nil { | ||||
| 					return nil, err | ||||
| 				} | ||||
| 				c.Data[sectionName] = template.HTML(buf.String()) | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		buf.Reset() | ||||
| 		executeTemplate(&buf, c.Layout, c.Data) | ||||
| 	} | ||||
| 	return buf.Bytes(), err | ||||
| } | ||||
| 
 | ||||
| func (c *Controller) renderTemplate() (bytes.Buffer, error) { | ||||
| 	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 { | ||||
| 		if c.Layout != "" && c.LayoutSections != nil { | ||||
| 			for _, sectionTpl := range c.LayoutSections { | ||||
| 				if sectionTpl == "" { | ||||
| 					continue | ||||
| @ -217,60 +240,7 @@ func (c *Controller) RenderBytes() ([]byte, error) { | ||||
| 		} | ||||
| 		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 | ||||
| 			} | ||||
| 		} | ||||
| 		c.Data["LayoutContent"] = template.HTML(buf.String()) | ||||
| 
 | ||||
| 		if c.LayoutSections != nil { | ||||
| 			for sectionName, sectionTpl := range c.LayoutSections { | ||||
| 				if sectionTpl == "" { | ||||
| 					c.Data[sectionName] = "" | ||||
| 					continue | ||||
| 				} | ||||
| 
 | ||||
| 				buf.Reset() | ||||
| 				err = getTemplateByName(sectionTpl).ExecuteTemplate(&buf, sectionTpl, c.Data) | ||||
| 				if err != nil { | ||||
| 					Trace("template Execute err:", err) | ||||
| 					return nil, err | ||||
| 				} | ||||
| 				c.Data[sectionName] = template.HTML(buf.String()) | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		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 | ||||
| 	} | ||||
| 
 | ||||
| 	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 | ||||
| 		} | ||||
| 	} | ||||
| 	return buf.Bytes(), nil | ||||
| 	return buf, executeTemplate(&buf, c.TplName, c.Data) | ||||
| } | ||||
| 
 | ||||
| // Redirect sends the redirection response to url with status code. | ||||
|  | ||||
							
								
								
									
										14
									
								
								template.go
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								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() { | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user