diff --git a/README.md b/README.md index 91f2ad7c..45270335 100644 --- a/README.md +++ b/README.md @@ -512,7 +512,7 @@ $ go get github.com/kataras/iris/v12@master **Run** ```sh -$ go mod tidy -compat=1.19 +$ go mod tidy -compat=1.19 # -compat="1.19" for windows. $ go run . ``` diff --git a/README_PT_BR.md b/README_PT_BR.md index 74a3ed9f..12353db0 100644 --- a/README_PT_BR.md +++ b/README_PT_BR.md @@ -475,7 +475,7 @@ $ go get github.com/kataras/iris/v12@master **Run** ```sh -$ go mod tidy -compat=1.19 +$ go mod tidy -compat=1.19 # -compat="1.19" for windows. $ go run . ``` diff --git a/_examples/view/overview/main.go b/_examples/view/overview/main.go index d75e2759..bd50af31 100644 --- a/_examples/view/overview/main.go +++ b/_examples/view/overview/main.go @@ -1,6 +1,17 @@ package main -import "github.com/kataras/iris/v12" +import ( + "html/template" + "time" + + "github.com/kataras/iris/v12" +) + +// ViewFunctions presents some builtin functions +// for html view engines. See `View.Funcs` or `view/html.Funcs` and etc. +var Functions = template.FuncMap{ + "Now": time.Now, +} func main() { app := iris.New() @@ -13,7 +24,8 @@ func main() { // - {{ yield . }} // - {{ current . }} app.RegisterView(iris.HTML("./templates", ".html"). - Reload(true)) // Set Reload false to production. + Funcs(Functions). // Optionally register some more builtin functions. + Reload(false)) // Set Reload to true on development. app.Get("/", func(ctx iris.Context) { // enable compression based on Accept-Encoding (e.g. "gzip"), @@ -30,13 +42,15 @@ func main() { }) app.Get("/example_map", func(ctx iris.Context) { - if err := ctx.View("example.html", iris.Map{ + examplePage := iris.Map{ "Name": "Example Name", "Age": 42, "Items": []string{"Example slice entry 1", "entry 2", "entry 3"}, "Map": iris.Map{"map key": "map value", "other key": "other value"}, "Nested": iris.Map{"Title": "Iris E-Book", "Pages": 620}, - }); err != nil { + } + + if err := ctx.View("example.html", examplePage); err != nil { ctx.HTML("

%s

", err.Error()) return } @@ -71,6 +85,23 @@ func main() { } }) + app.Get("/functions", func(ctx iris.Context) { + var functionsPage = struct { + // A function. + Now func() time.Time + // A struct field which contains methods. + Ctx iris.Context + }{ + Now: time.Now, + Ctx: ctx, + } + + if err := ctx.View("functions.html", functionsPage); err != nil { + ctx.HTML("

%s

", err.Error()) + return + } + }) + // http://localhost:8080/ app.Listen(":8080") } diff --git a/_examples/view/overview/templates/functions.html b/_examples/view/overview/templates/functions.html new file mode 100644 index 00000000..bfbf3709 --- /dev/null +++ b/_examples/view/overview/templates/functions.html @@ -0,0 +1,3 @@ +

Function: {{ Now }}

+

Field: {{ .Ctx.Request.URL.Path }}

+

Field Struct's Function (Method): {{ .Ctx.FullRequestURI }}

diff --git a/iris.go b/iris.go index 54b19682..4d966acb 100644 --- a/iris.go +++ b/iris.go @@ -82,7 +82,7 @@ type Application struct { minifier *minify.M // view engine - view view.View + view *view.View // used for build builded bool defaultMode bool @@ -120,6 +120,7 @@ func New() *Application { Router: router.NewRouter(), I18n: i18n.New(), minifier: newMinifier(), + view: new(view.View), } logger := newLogger(app) diff --git a/view/view.go b/view/view.go index 49a83868..694dd424 100644 --- a/view/view.go +++ b/view/view.go @@ -2,6 +2,7 @@ package view import ( "fmt" + "html/template" "io" "strings" @@ -76,6 +77,21 @@ func (v *View) AddFunc(funcName string, funcBody interface{}) { } } +// Funcs registers a template func map to the registered view engine(s). +func (v *View) Funcs(m template.FuncMap) *View { + if !v.Registered() { + return v + } + + if e, ok := v.Engine.(EngineFuncer); ok { + for k, v := range m { + e.AddFunc(k, v) + } + } + + return v +} + // Load compiles all the registered engines. func (v *View) Load() error { if !v.Registered() {