Getting Started
Request handling
- Routing
- Action Controller
- Resources
- Context
- Request Binding
- Middleware
- Error Handling
- Sessions
- Cookies
Frontend
Database
- Getting started with Pop
- Soda CLI
- Database Configuration
- Buffalo Integration
- Models
- Generators
- Migrations
- Fizz
- Mutations
- Querying
- Raw Queries
- Callbacks
- Scoping
- Associations and Relationships
- One to one associations
- One to many associations
Guides
- API Applications
- File Uploads
- Background Job Workers
- Mailers
- Tasks
- Plugins
- Local Authentication
- Third Party Authentication
- Events
- Go Modules
- Localization
- Logging
- Template Engines
- Testing
- Videos
Deploy
Frontend
Custom Helpers#
No templating package would be complete without allowing for you to build your own, custom, helper functions.
Registering Helpers#
Helper functions can be registered in two different places, depending on how they are to be used.
Global Helpers#
Most helpers will be global helpers, meaning that they should be included in every template. The types of
helpers can can be set in actions/render.go
:
func init() {
r = render.New(render.Options{
// ...
Helpers: render.Helpers{
"myHelper": func() string {
return "hello"
},
},
// ...
})
}
Per Request Helpers#
Other helpers, that are specific to a certain request can be added to the buffalo.Context
for that request.
func HomeHandler(c buffalo.Context) error {
// ...
c.Set("myHelper", func() string {
return "hello"
})
// ...
}
Return Values#
Plush allows you to return any values you would like from a helper function. This guide will focus on helpers that are designed to generate “output”.
When returning multiple values from a function, the first value will be the one used for rendering in the template.
If the last return value is an error
, Plush will handle that error.
string
#
Return just a string
. The string
will be HTML escaped, and deemed “not”-safe.
func() string {
return ""
}
template.HTML
#
https://golang.org/pkg/html/template/#HTML
Return a template.HTML
string. The template.HTML
will not be HTML escaped, and will be deemed safe.
func() template.HTML {
return template.HTML("")
}
Input Values#
Custom helper functions can take any type, and any number of arguments. You can even use variadic functions. There is an optional last argument, plush.HelperContext
, that can be received. It’s quite useful, and I would recommend taking it, as it provides you access to things like the context of the call, the block associated with the helper, etc…
Simple Helpers#
r := render.New(render.Options{
// ...
Helpers: render.Helpers{
"greet": func(name string) string {
return fmt.Sprintf("Hi %s!", name)
},
},
// ...
})
The greet
function is now available to all templates that use that render.Engine
.
// actions/greet.go
func Greeter(c buffalo.Context) error {
c.Set("name", "Mark")
return c.Render(200, r.String("<h1><%= greet(name) %></h1>"))
}
// output
<h1>Hi Mark!</h1>
Block Helpers#
Like the if
or for
statements, block helpers take a “block” of text that can be evaluated and potentially rendered, manipulated, or whatever you would like. To write a block helper, you have to take the plush.HelperContext
as the last argument to your helper function. This will give you access to the block associated with that call.
// actions/render.go
r := render.New(render.Options{
// ...
Helpers: render.Helpers{
"upblock": upblock,
},
// ...
})
// helper
func upblock(help plush.HelperContext) (template.HTML, error) {
s, err := help.Block()
if err != nil {
return "", err
}
return strings.ToUpper(s), nil
}
// actions/upper.go
func Upper(c buffalo.Context) error {
return c.Render(200, r.HTML("up.html"))
}
// templates/up.html
<%= upblock() { %>
hello world
<% } %>
// output
HELLO WORLD
Getting Values From the Context#
// actions/render.go
r := render.New(render.Options{
// ...
Helpers: render.Helpers{
"is_logged_in": isLoggedIn,
},
// ...
})
// helper
func isLoggedIn(help plush.HelperContext) bool {
return help.Value("current_user") != nil
}
// actions/users.go
func Show(c buffalo.Context) error {
c.Set("current_user", models.User{Name: "Ringo"})
return c.Render(200, r.HTML("users/show.html"))
}
// templates/users/show.html
<%= if (is_logged_in()) { %>
Hello <%= current_user.Name %>
<% } %>
// output
Hello Ringo