1
0
mirror of https://github.com/astaxie/beego.git synced 2025-07-07 02:20:19 +00:00

extract func parseFormTag from templatefunc.RenderForm

Extracted a func `parseFormTag` that takes a reflect.StructField
and returns the different positional parts of the `form` structTag
with default values as documented in
http://beego.me/docs/mvc/view/view.md#renderform

This makes RenderForm shorter and makes it possible to test the
parsing separately.
This commit is contained in:
Vangelis Tsoumenis
2014-06-29 19:19:32 +02:00
parent 62e9c89010
commit 3fe9e6a28a
2 changed files with 81 additions and 30 deletions

View File

@ -368,37 +368,11 @@ func RenderForm(obj interface{}) template.HTML {
}
fieldT := objT.Field(i)
tags := strings.Split(fieldT.Tag.Get("form"), ",")
label := fieldT.Name + ": "
name := fieldT.Name
fType := "text"
switch len(tags) {
case 1:
if tags[0] == "-" {
continue
}
if len(tags[0]) > 0 {
name = tags[0]
}
case 2:
if len(tags[0]) > 0 {
name = tags[0]
}
if len(tags[1]) > 0 {
fType = tags[1]
}
case 3:
if len(tags[0]) > 0 {
name = tags[0]
}
if len(tags[1]) > 0 {
fType = tags[1]
}
if len(tags[2]) > 0 {
label = tags[2]
}
}
label, name, fType, ignored := parseFormTag(fieldT)
if ignored {
continue
}
raw = append(raw, fmt.Sprintf(`%v<input name="%v" type="%v" value="%v">`,
label, name, fType, fieldV.Interface()))
@ -406,6 +380,44 @@ func RenderForm(obj interface{}) template.HTML {
return template.HTML(strings.Join(raw, "</br>"))
}
// parseFormTag takes the stuct-tag of a StructField and parses the `form` value.
// returned are the form label, name-property, type and wether the field should be ignored.
func parseFormTag(fieldT reflect.StructField) (label, name, fType string, ignored bool) {
tags := strings.Split(fieldT.Tag.Get("form"), ",")
label = fieldT.Name + ": "
name = fieldT.Name
fType = "text"
ignored = false;
switch len(tags) {
case 1:
if tags[0] == "-" {
ignored = true
}
if len(tags[0]) > 0 {
name = tags[0]
}
case 2:
if len(tags[0]) > 0 {
name = tags[0]
}
if len(tags[1]) > 0 {
fType = tags[1]
}
case 3:
if len(tags[0]) > 0 {
name = tags[0]
}
if len(tags[1]) > 0 {
fType = tags[1]
}
if len(tags[2]) > 0 {
label = tags[2]
}
}
return
}
func isStructPtr(t reflect.Type) bool {
return t.Kind() == reflect.Ptr && t.Elem().Kind() == reflect.Struct
}