Skip to content

Commit 72009da

Browse files
committed
update
1 parent 6e9690f commit 72009da

File tree

1 file changed

+119
-115
lines changed

1 file changed

+119
-115
lines changed

forms.go

Lines changed: 119 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,9 @@ func (form *Form) unWindStructure(m interface{}, baseName string) ([]interface{}
377377
fieldSetList := map[string]*FieldSetType{}
378378
fieldSetSort := map[string]string{}
379379
for i := 0; i < t.NumField(); i++ {
380+
if !v.Field(i).CanInterface() {
381+
continue
382+
}
380383
options := make(map[string]struct{})
381384
tag, tagf := common.Tag(t, t.Field(i), "form_options")
382385
if len(tag) > 0 {
@@ -393,57 +396,72 @@ func (form *Form) unWindStructure(m interface{}, baseName string) ([]interface{}
393396
}
394397
}
395398
}
396-
if _, ok := options["-"]; !ok {
397-
widget := common.TagVal(t, i, "form_widget")
398-
var f fields.FieldInterface
399-
var fName string
400-
if len(baseName) == 0 {
401-
fName = t.Field(i).Name
402-
} else {
403-
fName = strings.Join([]string{baseName, t.Field(i).Name}, ".")
404-
}
405-
useFieldValue := form.IsOmit(fName) == false
406-
//fmt.Println(fName, t.Field(i).Type.String(), t.Field(i).Type.Kind())
407-
switch widget {
408-
case "color", "email", "file", "image", "month", "search", "tel", "url", "week":
409-
f = fields.TextFieldFromInstance(v, t, i, fName, useFieldValue, widget)
410-
case "text":
399+
if _, ok := options["-"]; ok {
400+
continue
401+
}
402+
widget := common.TagVal(t, i, "form_widget")
403+
var f fields.FieldInterface
404+
var fName string
405+
if len(baseName) == 0 {
406+
fName = t.Field(i).Name
407+
} else {
408+
fName = strings.Join([]string{baseName, t.Field(i).Name}, ".")
409+
}
410+
useFieldValue := !form.IsOmit(fName)
411+
//fmt.Println(fName, t.Field(i).Type.String(), t.Field(i).Type.Kind())
412+
switch widget {
413+
case "color", "email", "file", "image", "month", "search", "tel", "url", "week":
414+
f = fields.TextFieldFromInstance(v, t, i, fName, useFieldValue, widget)
415+
case "text":
416+
f = fields.TextFieldFromInstance(v, t, i, fName, useFieldValue)
417+
case "hidden":
418+
f = fields.HiddenFieldFromInstance(v, t, i, fName, useFieldValue)
419+
case "textarea":
420+
f = fields.TextAreaFieldFromInstance(v, t, i, fName, useFieldValue)
421+
case "password":
422+
f = fields.PasswordFieldFromInstance(v, t, i, fName, useFieldValue)
423+
case "select":
424+
f = fields.SelectFieldFromInstance(v, t, i, fName, useFieldValue, options, form.labelFn)
425+
case "date":
426+
f = fields.DateFieldFromInstance(v, t, i, fName, useFieldValue)
427+
case "datetime":
428+
f = fields.DatetimeFieldFromInstance(v, t, i, fName, useFieldValue)
429+
case "time":
430+
f = fields.TimeFieldFromInstance(v, t, i, fName, useFieldValue)
431+
case "number":
432+
f = fields.NumberFieldFromInstance(v, t, i, fName, useFieldValue)
433+
case "range":
434+
f = fields.RangeFieldFromInstance(v, t, i, fName, useFieldValue)
435+
case "radio":
436+
f = fields.RadioFieldFromInstance(v, t, i, fName, useFieldValue, form.labelFn)
437+
case "checkbox":
438+
f = fields.CheckboxFieldFromInstance(v, t, i, fName, useFieldValue, form.labelFn)
439+
case "static":
440+
f = fields.StaticFieldFromInstance(v, t, i, fName, useFieldValue)
441+
default:
442+
switch t.Field(i).Type.String() {
443+
case "string":
411444
f = fields.TextFieldFromInstance(v, t, i, fName, useFieldValue)
412-
case "hidden":
413-
f = fields.HiddenFieldFromInstance(v, t, i, fName, useFieldValue)
414-
case "textarea":
415-
f = fields.TextAreaFieldFromInstance(v, t, i, fName, useFieldValue)
416-
case "password":
417-
f = fields.PasswordFieldFromInstance(v, t, i, fName, useFieldValue)
418-
case "select":
419-
f = fields.SelectFieldFromInstance(v, t, i, fName, useFieldValue, options, form.labelFn)
420-
case "date":
421-
f = fields.DateFieldFromInstance(v, t, i, fName, useFieldValue)
422-
case "datetime":
445+
case "bool":
446+
f = fields.CheckboxFromInstance(v, t, i, fName, useFieldValue, options)
447+
case "time.Time":
423448
f = fields.DatetimeFieldFromInstance(v, t, i, fName, useFieldValue)
424-
case "time":
425-
f = fields.TimeFieldFromInstance(v, t, i, fName, useFieldValue)
426-
case "number":
449+
case "int", "int64", "float", "float32", "float64":
427450
f = fields.NumberFieldFromInstance(v, t, i, fName, useFieldValue)
428-
case "range":
429-
f = fields.RangeFieldFromInstance(v, t, i, fName, useFieldValue)
430-
case "radio":
431-
f = fields.RadioFieldFromInstance(v, t, i, fName, useFieldValue, form.labelFn)
432-
case "checkbox":
433-
f = fields.CheckboxFieldFromInstance(v, t, i, fName, useFieldValue, form.labelFn)
434-
case "static":
435-
f = fields.StaticFieldFromInstance(v, t, i, fName, useFieldValue)
451+
case "struct":
452+
fl, fs := form.unWindStructure(v.Field(i).Interface(), fName)
453+
if len(fs) > 0 {
454+
if len(fieldSort) == 0 {
455+
fieldSort = fs
456+
} else {
457+
fieldSort += "," + fs
458+
}
459+
}
460+
fieldList = append(fieldList, fl...)
461+
f = nil
436462
default:
437-
switch t.Field(i).Type.String() {
438-
case "string":
439-
f = fields.TextFieldFromInstance(v, t, i, fName, useFieldValue)
440-
case "bool":
441-
f = fields.CheckboxFromInstance(v, t, i, fName, useFieldValue, options)
442-
case "time.Time":
443-
f = fields.DatetimeFieldFromInstance(v, t, i, fName, useFieldValue)
444-
case "int", "int64", "float", "float32", "float64":
445-
f = fields.NumberFieldFromInstance(v, t, i, fName, useFieldValue)
446-
case "struct":
463+
if t.Field(i).Type.Kind() == reflect.Struct ||
464+
(t.Field(i).Type.Kind() == reflect.Ptr && t.Field(i).Type.Elem().Kind() == reflect.Struct) {
447465
fl, fs := form.unWindStructure(v.Field(i).Interface(), fName)
448466
if len(fs) > 0 {
449467
if len(fieldSort) == 0 {
@@ -454,83 +472,69 @@ func (form *Form) unWindStructure(m interface{}, baseName string) ([]interface{}
454472
}
455473
fieldList = append(fieldList, fl...)
456474
f = nil
457-
default:
458-
if t.Field(i).Type.Kind() == reflect.Struct ||
459-
(t.Field(i).Type.Kind() == reflect.Ptr && t.Field(i).Type.Elem().Kind() == reflect.Struct) {
460-
fl, fs := form.unWindStructure(v.Field(i).Interface(), fName)
461-
if len(fs) > 0 {
462-
if len(fieldSort) == 0 {
463-
fieldSort = fs
464-
} else {
465-
fieldSort += "," + fs
466-
}
475+
} else {
476+
f = fields.TextFieldFromInstance(v, t, i, fName, useFieldValue)
477+
}
478+
}
479+
}
480+
if f != nil {
481+
label := common.TagVal(t, i, "form_label")
482+
if len(label) == 0 {
483+
label = strings.Title(t.Field(i).Name)
484+
}
485+
label = form.labelFn(label)
486+
f.SetLabel(label)
487+
488+
params := common.TagVal(t, i, "form_params")
489+
if len(params) > 0 {
490+
if paramsMap, err := url.ParseQuery(params); err == nil {
491+
for k, v := range paramsMap {
492+
if k == "placeholder" || k == "title" {
493+
v[0] = form.labelFn(v[0])
467494
}
468-
fieldList = append(fieldList, fl...)
469-
f = nil
470-
} else {
471-
f = fields.TextFieldFromInstance(v, t, i, fName, useFieldValue)
495+
f.SetParam(k, v[0])
472496
}
497+
} else {
498+
fmt.Println(err)
473499
}
474500
}
475-
if f != nil {
476-
label := common.TagVal(t, i, "form_label")
477-
if len(label) == 0 {
478-
label = strings.Title(t.Field(i).Name)
501+
valid := common.TagVal(t, i, "valid")
502+
if len(valid) > 0 {
503+
form.validTagFn(valid, f)
504+
}
505+
fieldsetLabel := common.TagVal(t, i, "form_fieldset")
506+
fieldsort := common.TagVal(t, i, "form_sort")
507+
if len(fieldsetLabel) > 0 {
508+
fieldsets := strings.SplitN(fieldsetLabel, ";", 2)
509+
var fieldsetName string
510+
switch len(fieldsets) {
511+
case 1:
512+
fieldsetName = fieldsets[0]
513+
case 2:
514+
fieldsetLabel = fieldsets[0]
515+
fieldsetName = fieldsets[1]
479516
}
480-
label = form.labelFn(label)
481-
f.SetLabel(label)
482-
483-
params := common.TagVal(t, i, "form_params")
484-
if len(params) > 0 {
485-
if paramsMap, err := url.ParseQuery(params); err == nil {
486-
for k, v := range paramsMap {
487-
if k == "placeholder" || k == "title" {
488-
v[0] = form.labelFn(v[0])
489-
}
490-
f.SetParam(k, v[0])
491-
}
517+
fieldsetLabel = form.labelFn(fieldsetLabel)
518+
f.SetData("container", "fieldset")
519+
if _, ok := fieldSetList[fieldsetName]; !ok {
520+
fieldSetList[fieldsetName] = form.NewFieldSet(fieldsetName, fieldsetLabel, f)
521+
} else {
522+
fieldSetList[fieldsetName].Elements(f)
523+
}
524+
if len(fieldsort) > 0 {
525+
if _, ok := fieldSetSort[fieldsetName]; !ok {
526+
fieldSetSort[fieldsetName] = fName + ":" + fieldsort
492527
} else {
493-
fmt.Println(err)
528+
fieldSetSort[fieldsetName] += "," + fName + ":" + fieldsort
494529
}
495530
}
496-
valid := common.TagVal(t, i, "valid")
497-
if len(valid) > 0 {
498-
form.validTagFn(valid, f)
499-
}
500-
fieldsetLabel := common.TagVal(t, i, "form_fieldset")
501-
fieldsort := common.TagVal(t, i, "form_sort")
502-
if len(fieldsetLabel) > 0 {
503-
fieldsets := strings.SplitN(fieldsetLabel, ";", 2)
504-
fieldsetName := ""
505-
switch len(fieldsets) {
506-
case 1:
507-
fieldsetName = fieldsets[0]
508-
case 2:
509-
fieldsetLabel = fieldsets[0]
510-
fieldsetName = fieldsets[1]
511-
}
512-
fieldsetLabel = form.labelFn(fieldsetLabel)
513-
f.SetData("container", "fieldset")
514-
if _, ok := fieldSetList[fieldsetName]; !ok {
515-
fieldSetList[fieldsetName] = form.NewFieldSet(fieldsetName, fieldsetLabel, f)
531+
} else {
532+
fieldList = append(fieldList, f)
533+
if len(fieldsort) > 0 {
534+
if len(fieldSort) == 0 {
535+
fieldSort = fName + ":" + fieldsort
516536
} else {
517-
fieldSetList[fieldsetName].Elements(f)
518-
}
519-
if len(fieldsort) > 0 {
520-
if _, ok := fieldSetSort[fieldsetName]; !ok {
521-
fieldSetSort[fieldsetName] = fName + ":" + fieldsort
522-
} else {
523-
fieldSetSort[fieldsetName] += "," + fName + ":" + fieldsort
524-
}
525-
}
526-
} else {
527-
fieldList = append(fieldList, f)
528-
if len(fieldsort) > 0 {
529-
if len(fieldSort) == 0 {
530-
fieldSort = fName + ":" + fieldsort
531-
} else {
532-
fieldSort += "," + fName + ":" + fieldsort
533-
}
537+
fieldSort += "," + fName + ":" + fieldsort
534538
}
535539
}
536540
}

0 commit comments

Comments
 (0)