HTML Inputs
Ponzu provides a number of helpful HTML Inputs to create forms which CMS admins
use to manage content. The input functions are typically used inside a Content
type's MarshalEditor() func from within an editor.Form() - for example:
// MarshalEditor writes a buffer of html to edit a Post within the CMS // and implements editor.Editable func (p *Post) MarshalEditor() ([]byte, error) { view, err := editor.Form(p, editor.Field{ // <- editor.Fields contain input-like funcs View: editor.Input("Title", p, map[string]string{ // <- makes a text input "label": "Title", "type": "text", "placeholder": "Enter the Title here", }), }, editor.Field{ View: editor.Richtext("Body", p, map[string]string{ // <- makes a WYSIWIG editor "label": "Body", "placeholder": "Enter the Body here", }), }, editor.Field{ View: editor.Input("Author", p, map[string]string{ "label": "Author", "type": "text", "placeholder": "Enter the Author here", }), }, ) if err != nil { return nil, fmt.Errorf("Failed to render Post editor view: %s", err.Error()) } return view, nil }
Field Input Functions¶
There are many of these input-like HTML view funcs exported from Ponzu's
management/editor package. Below is a list of the built-in options:
editor.Input¶
The editor.Input function produces a standard text input.
Screenshot¶

Function Signature¶
Input(fieldName string, p interface{}, attrs, options map[string]string) []byte
Example¶
... editor.Field{ View: editor.Input("Title", s, map[string]string{ "label": "Title", "type": "text", "placeholder": "Enter the Title here", }), }, ...
editor.InputRepeater¶
The editor.InputRepeater function applies a controller UI to the editor.Input
view so any arbitrary number of inputs can be added for your field.
Using Repeaters
When using the editor.InputRepeater make sure it's corresponding field is a slice []T
type. You will experience errors if it is not.
Screenshot¶

Function Signature¶
InputRepeater(fieldName string, p interface{}, attrs, options map[string]string) []byte
Example¶
... editor.Field{ View: editor.InputRepeater("Title", s, map[string]string{ "label": "Titles", "type": "text", "placeholder": "Enter the Title here", }), }, ...
editor.Checkbox¶
The editor.Checkbox function returns any number of checkboxes in a collection,
defined by the value:name map of options.
Screenshot¶

Function Signature¶
Checkbox(fieldName string, p interface{}, attrs, options map[string]string) []byte
Example¶
... editor.Field{ View: editor.Checkbox("Options", s, map[string]string{ "label": "Options", }, map[string]string{ // "value": "Display Name", "1": "First", "2": "Second", "3": "Third", }), }, ...
editor.Richtext¶
The editor.Richetext function displays an HTML5 rich text / WYSYWIG editor which
supports text formatting and styling, images, quotes, arbitrary HTML, and more.
The rich text editor is a modified version of Summernote using a theme called MaterialNote
Screenshot¶

Function Signature¶
Richtext(fieldName string, p interface{}, attrs map[string]string) []byte
Example¶
... editor.Field{ View: editor.Richtext("Opinion", s, map[string]string{ "label": "Rich Text Editor", "placeholder": "Enter the Opinion here", }), }, ...
editor.Tags¶
The editor.Tags function returns a container input element for lists of arbitrary
bits of information.
Screenshot¶

Function Signature¶
Tags(fieldName string, p interface{}, attrs map[string]string) []byte
Example¶
... editor.Field{ View: editor.Tags("Category", s, map[string]string{ "label": "Tags", "placeholder": "+Category", }), }, ...
editor.File¶
The editor.File function returns an HTML file upload element, which saves files
into the /uploads directory, and can be viewed from the "Uploads" section in the
Admin dashboard. See also the File Metadata API.
Field Type
When using the editor.File function, its corresponding field type must be
a string, as files will be stored as URL paths in the database.
Screenshot¶

Function Signature¶
File(fieldName string, p interface{}, attrs map[string]string) []byte
Example¶
... editor.Field{ View: editor.File("Photo", s, map[string]string{ "label": "File Upload", "placeholder": "Upload the Photo here", }), }, ...
editor.FileRepeater¶
The editor.FileRepeater function applies a controller UI to the editor.File
view so any arbitrary number of uploads can be added for your field.
Using Repeaters
When using the editor.FileRepeater make sure it's corresponding field is a slice []string
type. You will experience errors if it is not.
Screenshot¶

Function Signature¶
FileRepeater(fieldName string, p interface{}, attrs map[string]string) []byte
Example¶
... editor.Field{ View: editor.FileRepeater("Photo", s, map[string]string{ "label": "File Upload Repeater", "placeholder": "Upload the Photo here", }), }, ...
editor.Select¶
The editor.Select function returns a single HTML select input with options
as defined in the options map[string]string parameter of the function call.
Screenshot¶

Function Signature¶
func Select(fieldName string, p interface{}, attrs, options map[string]string) []byte
Example¶
... editor.Field{ View: editor.Select("Rating", s, map[string]string{ "label": "Select Dropdown", }, map[string]string{ // "value": "Display Name", "G": "G", "PG": "PG", "PG-13": "PG-13", "R": "R", }), }, ...
editor.SelectRepeater¶
The editor.SelectRepeater function applies a controller UI to the editor.Select
view so any arbitrary number of dropdowns can be added for your field.
Screenshot¶

Function Signature¶
func SelectRepeater(fieldName string, p interface{}, attrs, options map[string]string) []byte
Example¶
... editor.Field{ View: editor.SelectRepeater("Rating", s, map[string]string{ "label": "Select Dropdown Repeater", }, map[string]string{ // "value": "Display Name", "G": "G", "PG": "PG", "PG-13": "PG-13", "R": "R", }), }, ...
editor.Textarea¶
The editor.Textarea function returns an HTML textarea input to add unstyled text
blocks. Newlines in the textarea are preserved.
Screenshot¶

Function Signature¶
Textarea(fieldName string, p interface{}, attrs map[string]string) []byte
Example¶
... editor.Field{ View: editor.Textarea("Readme", s, map[string]string{ "label": "Textarea", "placeholder": "Enter the Readme here", }), }, ...
Data References¶
It is common to want to keep a reference from one Content type to another. To do
this in Ponzu, use the bosssauce/reference
package. It comes pre-installed with Ponzu as an "Addon".
reference.Select¶
Screenshot¶

Function Signature¶
func Select(fieldName string, p interface{}, attrs map[string]string, contentType, tmplString string) []byte
Example¶
... editor.Field{ View: reference.Select("DirectedBy", s, map[string]string{ "label": "Select Dropdown", }, "Director", `{{.last-name}}, {{.first_name}}`), }, ...
reference.SelectRepeater¶
Screenshot¶

Function Signature¶
func SelectRepeater(fieldName string, p interface{}, attrs map[string]string, contentType, tmplString string) []byte
Example¶
... editor.Field{ View: reference.SelectRepeater("PlacesFilmed", s, map[string]string{ "label": "Select Dropdown Repeater", }, "Location", `{{.name}}, {{.region}}`), }, ...