@@ -377,6 +377,9 @@ func (form *Form) unWindStructure(m interface{}, baseName string) ([]interface{}
377
377
fieldSetList := map [string ]* FieldSetType {}
378
378
fieldSetSort := map [string ]string {}
379
379
for i := 0 ; i < t .NumField (); i ++ {
380
+ if ! v .Field (i ).CanInterface () {
381
+ continue
382
+ }
380
383
options := make (map [string ]struct {})
381
384
tag , tagf := common .Tag (t , t .Field (i ), "form_options" )
382
385
if len (tag ) > 0 {
@@ -393,57 +396,72 @@ func (form *Form) unWindStructure(m interface{}, baseName string) ([]interface{}
393
396
}
394
397
}
395
398
}
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" :
411
444
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" :
423
448
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" :
427
450
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
436
462
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 ) {
447
465
fl , fs := form .unWindStructure (v .Field (i ).Interface (), fName )
448
466
if len (fs ) > 0 {
449
467
if len (fieldSort ) == 0 {
@@ -454,83 +472,69 @@ func (form *Form) unWindStructure(m interface{}, baseName string) ([]interface{}
454
472
}
455
473
fieldList = append (fieldList , fl ... )
456
474
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 ])
467
494
}
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 ])
472
496
}
497
+ } else {
498
+ fmt .Println (err )
473
499
}
474
500
}
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 ]
479
516
}
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
492
527
} else {
493
- fmt . Println ( err )
528
+ fieldSetSort [ fieldsetName ] += "," + fName + ":" + fieldsort
494
529
}
495
530
}
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
516
536
} 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
534
538
}
535
539
}
536
540
}
0 commit comments