mirror of
https://github.com/astaxie/beego.git
synced 2024-11-01 02:20:55 +00:00
templateform.RenderForm now renders textarea
When RenderForm encounters a field with the structTag `form` value type `textarea` it renders an actual <textarea> html tag.
This commit is contained in:
parent
a991b9dcde
commit
4994d36b66
@ -327,7 +327,6 @@ func ParseForm(form url.Values, obj interface{}) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
var unKind = map[reflect.Kind]bool{
|
||||
reflect.Uintptr: true,
|
||||
reflect.Complex64: true,
|
||||
@ -367,12 +366,30 @@ func RenderForm(obj interface{}) template.HTML {
|
||||
continue
|
||||
}
|
||||
|
||||
raw = append(raw, fmt.Sprintf(`%v<input name="%v" type="%v" value="%v">`,
|
||||
label, name, fType, fieldV.Interface()))
|
||||
raw = append(raw, renderFormField(label, name, fType, fieldV.Interface()))
|
||||
}
|
||||
return template.HTML(strings.Join(raw, "</br>"))
|
||||
}
|
||||
|
||||
func renderFormField(label, name, fType string, value interface{}) string {
|
||||
if isValidForInput(fType) {
|
||||
return fmt.Sprintf(`%v<input name="%v" type="%v" value="%v">`, label, name, fType, value)
|
||||
}
|
||||
|
||||
return fmt.Sprintf(`%v<%v name="%v">%v</%v>`, label, fType, name, value, fType)
|
||||
}
|
||||
|
||||
func isValidForInput(fType string) bool {
|
||||
validInputTypes := strings.Fields("text password checkbox radio submit reset hidden image file button")
|
||||
for _, validType := range validInputTypes {
|
||||
if fType == validType {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
// 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) {
|
||||
|
@ -148,9 +148,10 @@ func TestRenderForm(t *testing.T) {
|
||||
Sex string
|
||||
Email []string
|
||||
Intro string `form:",textarea"`
|
||||
Ignored string `form:"-"`
|
||||
}
|
||||
|
||||
u := user{Name: "test"}
|
||||
u := user{Name: "test", Intro: "Some Text"}
|
||||
output := RenderForm(u)
|
||||
if output != template.HTML("") {
|
||||
t.Errorf("output should be empty but got %v", output)
|
||||
@ -160,12 +161,24 @@ func TestRenderForm(t *testing.T) {
|
||||
`Name: <input name="username" type="text" value="test"></br>` +
|
||||
`年龄:<input name="age" type="text" value="0"></br>` +
|
||||
`Sex: <input name="Sex" type="text" value=""></br>` +
|
||||
`Intro: <input name="Intro" type="textarea" value="">`)
|
||||
`Intro: <textarea name="Intro">Some Text</textarea>`)
|
||||
if output != result {
|
||||
t.Errorf("output should equal `%v` but got `%v`", result, output)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRenderFormField(t *testing.T) {
|
||||
html := renderFormField("Label: ", "Name", "text", "Value")
|
||||
if html != `Label: <input name="Name" type="text" value="Value">` {
|
||||
t.Errorf("Wrong html output for input[type=text]: %v ", html)
|
||||
}
|
||||
|
||||
html = renderFormField("Label: ", "Name", "textarea", "Value")
|
||||
if html != `Label: <textarea name="Name">Value</textarea>` {
|
||||
t.Errorf("Wrong html output for textarea: %v ", html)
|
||||
}
|
||||
}
|
||||
|
||||
func TestParseFormTag(t *testing.T) {
|
||||
// create struct to contain field with different types of struct-tag `form`
|
||||
type user struct {
|
||||
|
Loading…
Reference in New Issue
Block a user