Skip to content
Projects
Groups
Snippets
Help
Loading...
Sign in
Toggle navigation
B
beego
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Commits
Issue Boards
Open sidebar
go
beego
Commits
a2e63a38
Commit
a2e63a38
authored
Jul 14, 2016
by
astaxie
Committed by
GitHub
Jul 14, 2016
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #1993 from NerdsvilleCEO/develop
Add meta fields with required flag on RenderForm
parents
a08e937c
e0393b72
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
54 additions
and
18 deletions
+54
-18
templatefunc.go
templatefunc.go
+18
-6
templatefunc_test.go
templatefunc_test.go
+36
-12
No files found.
templatefunc.go
View file @
a2e63a38
...
...
@@ -421,18 +421,18 @@ func RenderForm(obj interface{}) template.HTML {
fieldT
:=
objT
.
Field
(
i
)
label
,
name
,
fType
,
id
,
class
,
ignored
:=
parseFormTag
(
fieldT
)
label
,
name
,
fType
,
id
,
class
,
ignored
,
required
:=
parseFormTag
(
fieldT
)
if
ignored
{
continue
}
raw
=
append
(
raw
,
renderFormField
(
label
,
name
,
fType
,
fieldV
.
Interface
(),
id
,
class
))
raw
=
append
(
raw
,
renderFormField
(
label
,
name
,
fType
,
fieldV
.
Interface
(),
id
,
class
,
required
))
}
return
template
.
HTML
(
strings
.
Join
(
raw
,
"</br>"
))
}
// renderFormField returns a string containing HTML of a single form field.
func
renderFormField
(
label
,
name
,
fType
string
,
value
interface
{},
id
string
,
class
string
)
string
{
func
renderFormField
(
label
,
name
,
fType
string
,
value
interface
{},
id
string
,
class
string
,
required
bool
)
string
{
if
id
!=
""
{
id
=
" id=
\"
"
+
id
+
"
\"
"
}
...
...
@@ -441,11 +441,16 @@ func renderFormField(label, name, fType string, value interface{}, id string, cl
class
=
" class=
\"
"
+
class
+
"
\"
"
}
requiredString
:=
""
if
required
{
requiredString
=
" required"
}
if
isValidForInput
(
fType
)
{
return
fmt
.
Sprintf
(
`%v<input%v%v name="%v" type="%v" value="%v"
>`
,
label
,
id
,
class
,
name
,
fType
,
value
)
return
fmt
.
Sprintf
(
`%v<input%v%v name="%v" type="%v" value="%v"
%v>`
,
label
,
id
,
class
,
name
,
fType
,
value
,
requiredString
)
}
return
fmt
.
Sprintf
(
`%v<%v%v%v name="%v"
>%v</%v>`
,
label
,
fType
,
id
,
class
,
name
,
value
,
fType
)
return
fmt
.
Sprintf
(
`%v<%v%v%v name="%v"
%v>%v</%v>`
,
label
,
fType
,
id
,
class
,
name
,
requiredString
,
value
,
fType
)
}
// isValidForInput checks if fType is a valid value for the `type` property of an HTML input element.
...
...
@@ -461,7 +466,7 @@ func isValidForInput(fType string) bool {
// 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
,
id
string
,
class
string
,
ignored
bool
)
{
func
parseFormTag
(
fieldT
reflect
.
StructField
)
(
label
,
name
,
fType
string
,
id
string
,
class
string
,
ignored
bool
,
required
bool
)
{
tags
:=
strings
.
Split
(
fieldT
.
Tag
.
Get
(
"form"
),
","
)
label
=
fieldT
.
Name
+
": "
name
=
fieldT
.
Name
...
...
@@ -470,6 +475,12 @@ func parseFormTag(fieldT reflect.StructField) (label, name, fType string, id str
id
=
fieldT
.
Tag
.
Get
(
"id"
)
class
=
fieldT
.
Tag
.
Get
(
"class"
)
required
=
false
required_field
:=
fieldT
.
Tag
.
Get
(
"required"
)
if
required_field
!=
"-"
&&
required_field
!=
""
{
required
,
_
=
strconv
.
ParseBool
(
required_field
)
}
switch
len
(
tags
)
{
case
1
:
if
tags
[
0
]
==
"-"
{
...
...
@@ -496,6 +507,7 @@ func parseFormTag(fieldT reflect.StructField) (label, name, fType string, id str
label
=
tags
[
2
]
}
}
return
}
...
...
templatefunc_test.go
View file @
a2e63a38
...
...
@@ -195,54 +195,78 @@ func TestRenderForm(t *testing.T) {
}
func
TestRenderFormField
(
t
*
testing
.
T
)
{
html
:=
renderFormField
(
"Label: "
,
"Name"
,
"text"
,
"Value"
,
""
,
""
)
html
:=
renderFormField
(
"Label: "
,
"Name"
,
"text"
,
"Value"
,
""
,
""
,
false
)
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"
,
""
,
""
)
html
=
renderFormField
(
"Label: "
,
"Name"
,
"textarea"
,
"Value"
,
""
,
""
,
false
)
if
html
!=
`Label: <textarea name="Name">Value</textarea>`
{
t
.
Errorf
(
"Wrong html output for textarea: %v "
,
html
)
}
html
=
renderFormField
(
"Label: "
,
"Name"
,
"textarea"
,
"Value"
,
""
,
""
,
true
)
if
html
!=
`Label: <textarea name="Name" required>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
{
All
int
`form:"name,text,年龄:"`
NoName
int
`form:",hidden,年龄:"`
OnlyLabel
int
`form:",,年龄:"`
OnlyName
int
`form:"name" id:"name" class:"form-name"`
Ignored
int
`form:"-"`
All
int
`form:"name,text,年龄:"`
NoName
int
`form:",hidden,年龄:"`
OnlyLabel
int
`form:",,年龄:"`
OnlyName
int
`form:"name" id:"name" class:"form-name"`
Ignored
int
`form:"-"`
Required
int
`form:"name" required:"true"`
IgnoreRequired
int
`form:"name"`
NotRequired
int
`form:"name" required:"false"`
}
objT
:=
reflect
.
TypeOf
(
&
user
{})
.
Elem
()
label
,
name
,
fType
,
id
,
class
,
ignored
:=
parseFormTag
(
objT
.
Field
(
0
))
label
,
name
,
fType
,
id
,
class
,
ignored
,
required
:=
parseFormTag
(
objT
.
Field
(
0
))
if
!
(
name
==
"name"
&&
label
==
"年龄:"
&&
fType
==
"text"
&&
ignored
==
false
)
{
t
.
Errorf
(
"Form Tag with name, label and type was not correctly parsed."
)
}
label
,
name
,
fType
,
id
,
class
,
ignored
=
parseFormTag
(
objT
.
Field
(
1
))
label
,
name
,
fType
,
id
,
class
,
ignored
,
required
=
parseFormTag
(
objT
.
Field
(
1
))
if
!
(
name
==
"NoName"
&&
label
==
"年龄:"
&&
fType
==
"hidden"
&&
ignored
==
false
)
{
t
.
Errorf
(
"Form Tag with label and type but without name was not correctly parsed."
)
}
label
,
name
,
fType
,
id
,
class
,
ignored
=
parseFormTag
(
objT
.
Field
(
2
))
label
,
name
,
fType
,
id
,
class
,
ignored
,
required
=
parseFormTag
(
objT
.
Field
(
2
))
if
!
(
name
==
"OnlyLabel"
&&
label
==
"年龄:"
&&
fType
==
"text"
&&
ignored
==
false
)
{
t
.
Errorf
(
"Form Tag containing only label was not correctly parsed."
)
}
label
,
name
,
fType
,
id
,
class
,
ignored
=
parseFormTag
(
objT
.
Field
(
3
))
label
,
name
,
fType
,
id
,
class
,
ignored
,
required
=
parseFormTag
(
objT
.
Field
(
3
))
if
!
(
name
==
"name"
&&
label
==
"OnlyName: "
&&
fType
==
"text"
&&
ignored
==
false
&&
id
==
"name"
&&
class
==
"form-name"
)
{
t
.
Errorf
(
"Form Tag containing only name was not correctly parsed."
)
}
label
,
name
,
fType
,
id
,
class
,
ignored
=
parseFormTag
(
objT
.
Field
(
4
))
label
,
name
,
fType
,
id
,
class
,
ignored
,
required
=
parseFormTag
(
objT
.
Field
(
4
))
if
ignored
==
false
{
t
.
Errorf
(
"Form Tag that should be ignored was not correctly parsed."
)
}
label
,
name
,
fType
,
id
,
class
,
ignored
,
required
=
parseFormTag
(
objT
.
Field
(
5
))
if
!
(
name
==
"name"
&&
required
==
true
)
{
t
.
Errorf
(
"Form Tag containing only name and required was not correctly parsed."
)
}
label
,
name
,
fType
,
id
,
class
,
ignored
,
required
=
parseFormTag
(
objT
.
Field
(
6
))
if
!
(
name
==
"name"
&&
required
==
false
)
{
t
.
Errorf
(
"Form Tag containing only name and ignore required was not correctly parsed."
)
}
label
,
name
,
fType
,
id
,
class
,
ignored
,
required
=
parseFormTag
(
objT
.
Field
(
7
))
if
!
(
name
==
"name"
&&
required
==
false
)
{
t
.
Errorf
(
"Form Tag containing only name and not required was not correctly parsed."
)
}
}
func
TestMapGet
(
t
*
testing
.
T
)
{
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment