logo Buffalo slack logo
Helpers Personalizados
Frontend

Helpers personalizados

Este documento solo aplica cuando se usa github.com/gobuffalo/buffalo/render.

Consulta github.com/gobuffalo/plush para más detalles sobre el paquete de plantillas.

Ningún paquete de plantillas estaría completo sim permitirte construir tus propias funciónes helper personalizadas.

Registrar Helpers

Las funciónes helpers se pueden registrar en dos diferentes lugares, dependiendo de como se vayan a usar.

Helper globales

La mayoría de helpers seran helpers globales, esto quiere decir que se podrán incluir en cualquier plantilla. Los tipos de helpers pueden ser establecidos en actions/render.go:

func init() {
  r = render.New(render.Options{
    // ...
    Helpers: render.Helpers{
      "myHelper": func() string {
        return "hello"
      },
    },
    // ...
  })
}

Helpers por petición

Otros helpers, que son específicos a una determinada petición se pueden agregar al buffalo.Context de esa petición.

func HomeHandler(c buffalo.Context) error {
  // ...
  c.Set("myHelper", func() string {
    return "hello"
  })
  // ...
}

Valores retornados

Plush te permite retornar cualquier valor que desees de una función helper. Esta guía se enfocará en los helpers que estan diseñados para generar “salidas”.

Cuando retornamos multiples valores de una función, el primer valor será el que se use para renderizar en la plantilla. Si el ultimo valor retornado es un error, Plush manejará ese error.


string

Retornar sólo un string. El string será escapado de HTML y considerada “no” seguro.

func() string {
  return ""
}

template.HTML

https://golang.org/pkg/html/template/#HTML

Retornar sólo una cadena de template.HTML. El template.HTML no será escapado de HTML y será considerado seguro.

func() template.HTML {
  return template.HTML("")
}

Valores de entrada

Las funciónes helper personalizadas pueden tomar cualquier tipo, y cualquier numero de argumentos. Incluso puede utilizar funciónes variádicas. Hay un ultimo argumento opcional: plush.HelperContext, que se puede recibir. Es bastante útil, y te recomendaría tomarlo, ya que te proporciona acceso a cosas como el contexto de la llamada, el bloque asociado al helper, etc…

Helpers simples

r := render.New(render.Options{
  // ...
  Helpers: render.Helpers{
    "greet": func(name string) string {
      return fmt.Sprintf("Hi %s!", name)
    },
  },
  // ...
})

La función greet ahora está disponible para todas las plantillas que usen ese motor render.Engine.

// actions/greet.go
func Greeter(c buffalo.Context) error {
  c.Set("name", "Mark")
  return c.Render(http.StatusOK, r.String("<h1><%= greet(name) %></h1>"))
}
// output
<h1>Hi Mark!</h1>

Helpers en bloque

Como las sentencias if o for, los helpers en bloques toman un “bloque” de texto que se puede evaluar y potencialmente renderizar, manipular o lo que quisieras. Para escribir un helper en bloque, tienes que tomar el plush.HelperContext como el último argumento de tu función helper. Esto te dará acceso al bloque asociado con esa llamada.

r := render.New(render.Options{
  // ...
  Helpers: render.Helpers{
    "upblock": upblock,
  },
  // ...
})
func upblock(help plush.HelperContext) (template.HTML, error) {
  s, err := help.Block()
  if err != nil {
    return "", err
  }
  return strings.ToUpper(s), nil
}
func Upper(c buffalo.Context) error {
  return c.Render(http.StatusOK, r.HTML("up.plush.html"))
}
<%= upblock() { %>
  hello world
<% } %>
HELLO WORLD

Obteniendo valores del contexto

r := render.New(render.Options{
  // ...
  Helpers: render.Helpers{
    "is_logged_in": isLoggedIn,
  },
  // ...
})
func isLoggedIn(help plush.HelperContext) bool {
  return help.Value("current_user") != nil
}
func Show(c buffalo.Context) error {
  c.Set("current_user", models.User{Name: "Ringo"})
  return c.Render(http.StatusOK, r.HTML("users/show.plush.html"))
}
<%= if (is_logged_in()) { %>
  Hello <%= current_user.Name %>
<% } %>
// output
Hello Ringo