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.tmpl
from 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.