Skip to content

Commit 816eeeb

Browse files
committed
Version 0.3.9.2
* Render增加SetTemplatePath接口,用于设置模板默认目录, 默认添加base、base/templates、base/views * 模板查找顺序从最后一个插入的元素开始往前找 * SetTemplatePath(path ...string) * 2017-04-01 10:30
1 parent 3dca0dd commit 816eeeb

6 files changed

Lines changed: 79 additions & 4 deletions

File tree

context.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,9 @@ func (ctx *HttpContext) ReadCookie(name string) (*http.Cookie, error) {
370370
// write view content to response
371371
func (ctx *HttpContext) View(name string) error {
372372
err := ctx.HttpServer.Renderer().Render(ctx.Response.Writer(), name, ctx.ViewData().GetCurrentMap(), ctx)
373+
if err != nil {
374+
panic(err.Error())
375+
}
373376
return err
374377
}
375378

example/render/main.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ func main() {
2323
//设置路由
2424
InitRoute(app.HttpServer)
2525

26+
//set default template path, support multi path
27+
//模板查找顺序从最后一个插入的元素开始往前找
28+
//默认添加base、base/templates、base/views
29+
app.HttpServer.Renderer().SetTemplatePath("d:/gotmp", "d:/tmp")
30+
2631
//启动 监控服务
2732
//pprofport := 8081
2833
//go app.StartPProfServer(pprofport)
@@ -44,6 +49,10 @@ type BookInfo struct {
4449
Size int64
4550
}
4651

52+
func NotExistView(ctx *dotweb.HttpContext) {
53+
ctx.View("1.html")
54+
}
55+
4756
func TestView(ctx *dotweb.HttpContext) {
4857
ctx.ViewData().Set("data", "图书信息")
4958
ctx.ViewData().Set("user", &UserInfo{UserName: "user1", Sex: true})
@@ -60,4 +69,5 @@ func TestView(ctx *dotweb.HttpContext) {
6069

6170
func InitRoute(server *dotweb.HttpServer) {
6271
server.Router().GET("/", TestView)
72+
server.Router().GET("/noview", NotExistView)
6373
}

framework/file/file.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,3 +29,9 @@ func GetFileExt(fileName string) string {
2929
}
3030
}
3131
}
32+
33+
//check filename is exist
34+
func Exist(filename string) bool {
35+
_, err := os.Stat(filename)
36+
return err == nil || os.IsExist(err)
37+
}

render.go

Lines changed: 50 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package dotweb
22

33
import (
4+
"errors"
5+
"github.com/devfeel/dotweb/framework/file"
46
"html/template"
57
"io"
68
"io/ioutil"
@@ -9,33 +11,71 @@ import (
911

1012
//Renderer is the interface that wraps the render method.
1113
type Renderer interface {
14+
//set default template path, support multi path
15+
//模板查找顺序从最后一个插入的元素开始往前找
16+
//默认添加base、base/templates、base/views
17+
SetTemplatePath(path ...string)
1218
Render(io.Writer, string, interface{}, *HttpContext) error
1319
}
1420

1521
type innerRenderer struct {
22+
templatePaths []string
1623
}
1724

1825
// Render render view use http/template
1926
func (r *innerRenderer) Render(w io.Writer, tpl string, data interface{}, ctx *HttpContext) error {
20-
t, err := parseFile(tpl)
27+
t, err := r.parseFile(tpl)
2128
if err != nil {
2229
return err
2330
}
2431
return t.Execute(w, data)
2532
}
2633

34+
//set default template paths, support multi path
35+
//模板查找顺序从最后一个插入的元素开始往前找
36+
//默认添加base、base/templates、base/views
37+
func (r *innerRenderer) SetTemplatePath(path ...string) {
38+
r.templatePaths = append(r.templatePaths, path...)
39+
}
40+
2741
// 定义函数unescaped
2842
func unescaped(x string) interface{} { return template.HTML(x) }
2943

3044
// return http/template by gived file name
31-
func parseFile(filename string) (*template.Template, error) {
45+
func (r *innerRenderer) parseFile(filename string) (*template.Template, error) {
3246
var t *template.Template
33-
b, err := ioutil.ReadFile(filename)
47+
findlog := filename
48+
realTempFile := filename
49+
isExist := false
50+
//多级检查
51+
if !file.Exist(filename) {
52+
tmpFileName := filename
53+
for i := len(r.templatePaths) - 1; i >= 0; i-- {
54+
if r.templatePaths[i] == "" {
55+
break
56+
}
57+
tmpFileName = r.templatePaths[i] + "/" + filename
58+
findlog += "\r\n" + tmpFileName
59+
if file.Exist(tmpFileName) {
60+
realTempFile = tmpFileName
61+
isExist = true
62+
break
63+
}
64+
}
65+
} else {
66+
isExist = true
67+
}
68+
69+
if !isExist {
70+
return nil, errors.New("not found template file=>\r\n " + findlog)
71+
}
72+
73+
b, err := ioutil.ReadFile(realTempFile)
3474
if err != nil {
3575
return nil, err
3676
}
3777
s := string(b)
38-
name := filepath.Base(filename)
78+
name := filepath.Base(realTempFile)
3979
t = template.New(name)
4080
t = registeTemplateFunc(t)
4181
_, err = t.Parse(s)
@@ -54,5 +94,11 @@ func registeTemplateFunc(t *template.Template) *template.Template {
5494
// NewInnerRenderer create a inner renderer instance
5595
func NewInnerRenderer() *innerRenderer {
5696
r := new(innerRenderer)
97+
r.templatePaths = make([]string, 3)
98+
//添加基础路径
99+
//base、base/templates、base/views
100+
r.templatePaths = append(r.templatePaths, file.GetCurrentDirectory())
101+
r.templatePaths = append(r.templatePaths, file.GetCurrentDirectory()+"/templates")
102+
r.templatePaths = append(r.templatePaths, file.GetCurrentDirectory()+"/views")
57103
return r
58104
}

server.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,11 @@ func (server *HttpServer) Binder() Binder {
166166
}
167167

168168
//get renderer interface in server
169+
//if no set, init InnerRenderer
169170
func (server *HttpServer) Renderer() Renderer {
171+
if server.render == nil {
172+
server.render = NewInnerRenderer()
173+
}
170174
return server.render
171175
}
172176

version.MD

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,11 @@
11
##dotweb版本记录:
22

3+
#### Version 0.3.9.2
4+
* Render增加SetTemplatePath接口,用于设置模板默认目录, 默认添加base、base/templates、base/views
5+
* 模板查找顺序从最后一个插入的元素开始往前找
6+
* SetTemplatePath(path ...string)
7+
* 2017-04-01 10:30
8+
39
#### Version 0.3.9.1
410
* Router增加MatchPath接口,用于检查指定请求与指定路由是否匹配,一般用于HttpModule中
511
* ctx.HttpServer.Router().MatchPath(ctx, "/user")

0 commit comments

Comments
 (0)