Render provides handy controls when rendering templates.
Initialize Render
import "github.com/qor/render"
func main() {
Render := render.New(&render.Config{
ViewPaths: []string{"app/new_view_path"},
DefaultLayout: "application", // default value is application
FuncMapMaker: func(*Render, *http.Request, http.ResponseWriter) template.FuncMap {
// genereate FuncMap that could be used when render template based on request info
},
})
}Next, invoke Execute function to render your template...
Render.Execute("index", context, request, writer)The Execute function accepts 4 parameters:
- The template name. In this example Render will look up template
index.tmplfrom view paths. the default view path is{current_repo_path}/app/views, and you could register more view paths. - The context you can use in the template, it is an
interface{}, you could use that in views. for example, if you passcontext["CurrentUserName"] = "Memememe"as the context. In the template, you can call{% raw %}{{.CurrentUserName}}{% endraw %}to get the value "Memememe". - http.Request of Go.
- http.ResponseWriter of Go.
yield is a func that could be used in layout views, it will render current specified template. For above example, think yield as a placeholder, and it will replaced with template index.tmpl's content.
<!-- app/views/layout/application.tmpl -->
<html>
<head>
</head>
<body>
{{yield}}
</body>
</html>The default layout is {current_repo_path}/app/views/layouts/application.tmpl. If you want use another layout like new_layout, you can pass it as a parameter to Layout function.
Render.Layout("new_layout").Execute("index", context, request, writer)Render will find the layout at {current_repo_path}/app/views/layouts/new_layout.tmpl.
Sometimes you may want to have some helper functions in your template. Render supports passing helper functions by Funcs function.
Render.Funcs(funcsMap).Execute("index", obj, request, writer)The funcsMap is based on html/template.FuncMap. So with
funcMap := template.FuncMap{
"Greet": func(name string) string { return "Hello " + name },
}You can call this in the template
{{Greet "Memememe" }}The output is Hello Memememe.
Use with Responder
Put the Render inside Responder handle function like this.
func handler(writer http.ResponseWriter, request *http.Request) {
responder.With("html", func() {
Render.Execute("demo/index", viewContext, *http.Request, http.ResponseWriter)
}).With([]string{"json", "xml"}, func() {
writer.Write([]byte("this is a json or xml request"))
}).Respond(request)
})Use with Bindatafs
$ bindatafs --exit-after-compile=false config/views
func main() {
Render := render.New()
Render.SetAssetFS(views.AssetFS)
Render.Execute("index", context, request, writer)
}Released under the MIT License.