@@ -509,7 +509,7 @@ func fillAttributeViewAutoGeneratedValues(attrView *av.AttributeView, collection
509509 }
510510}
511511
512- func fillAttributeViewTemplateValues (attrView * av.AttributeView , collection av.Collection , ials map [string ]map [string ]string , items map [string ][]* av.KeyValues , renderedTemplateKeyCollections map [ string ]av. Collection ) (err error ) {
512+ func fillAttributeViewTemplateValues (attrView * av.AttributeView , collection av.Collection , ials map [string ]map [string ]string , items map [string ][]* av.KeyValues ) (err error ) {
513513 existTemplateField := false
514514 for _ , kVals := range attrView .KeyValues {
515515 if av .KeyTypeTemplate == kVals .Key .Type {
@@ -521,40 +521,34 @@ func fillAttributeViewTemplateValues(attrView *av.AttributeView, collection av.C
521521 return
522522 }
523523
524- var renderTemplateErr error
525- for _ , item := range collection .GetItems () {
526- for _ , value := range item .GetValues () {
527- itemID := item .GetID ()
524+ templateKeys , _ := GetTemplateKeysByResolutionOrder (attrView )
525+ for _ , templateKey := range templateKeys {
526+ for _ , item := range collection .GetItems () {
527+ value := item .GetValue (templateKey .ID )
528+ keyValues := items [item .GetID ()]
529+ var ial map [string ]string
530+ blockVal := item .GetBlockValue ()
531+ if nil != blockVal {
532+ ial = ials [blockVal .Block .ID ]
533+ }
534+ if nil == ial {
535+ ial = map [string ]string {}
536+ }
528537
529- switch value .Type {
530- case av .KeyTypeTemplate : // 渲染模板字段
531- keyValues := items [itemID ]
532- var ial map [string ]string
533- blockVal := item .GetBlockValue ()
534- if nil != blockVal {
535- ial = ials [blockVal .Block .ID ]
536- }
537- if nil == ial {
538- ial = map [string ]string {}
539- }
540- content , renderErr := RenderTemplateField (ial , keyValues , value .Template .Content )
541- value .Template .Content = content
542- if nil != renderErr {
543- key , _ := attrView .GetKey (value .KeyID )
544- keyName := ""
545- if nil != key {
546- keyName = key .Name
547- }
548- err = fmt .Errorf ("database [%s] template field [%s] rendering failed: %s" , getAttrViewName (attrView ), keyName , renderErr )
538+ content , renderErr := RenderTemplateField (ial , keyValues , value .Template .Content )
539+ if nil != renderErr {
540+ key , _ := attrView .GetKey (value .KeyID )
541+ keyName := ""
542+ if nil != key {
543+ keyName = key .Name
549544 }
545+ err = fmt .Errorf ("database [%s] template field [%s] rendering failed: %s" , getAttrViewName (attrView ), keyName , renderErr )
550546 }
551547
552- if nil != err {
553- renderTemplateErr = err
554- }
548+ value .Template .Content = content
549+ items [item .GetID ()] = append (keyValues , & av.KeyValues {Key : templateKey , Values : []* av.Value {value }})
555550 }
556551 }
557- err = renderTemplateErr
558552 return
559553}
560554
@@ -765,6 +759,50 @@ func manualSort(view *av.View, collection av.Collection) {
765759 collection .SetItems (items )
766760}
767761
762+ func GetTemplateKeysByResolutionOrder (attrView * av.AttributeView ) (ret []* av.Key , resolved bool ) {
763+ ret = []* av.Key {}
764+
765+ resolvedTemplateKeys := map [string ]bool {}
766+ for i := 0 ; i < 7 ; i ++ {
767+ templateKeyCount := 0
768+ for _ , keyValues := range attrView .KeyValues {
769+ if av .KeyTypeTemplate != keyValues .Key .Type {
770+ continue
771+ }
772+
773+ templateKeyCount ++
774+ vars , err := getTemplateVars (keyValues .Key .Template )
775+ if nil != err {
776+ resolvedTemplateKeys [keyValues .Key .ID ] = true
777+ ret = append (ret , keyValues .Key )
778+ continue
779+ }
780+
781+ currentTemplateKeyResolved := true
782+ for _ , kValues := range attrView .KeyValues {
783+ if gulu .Str .Contains (kValues .Key .Name , vars ) {
784+ if av .KeyTypeTemplate == kValues .Key .Type {
785+ if _ , ok := resolvedTemplateKeys [kValues .Key .ID ]; ! ok {
786+ currentTemplateKeyResolved = false
787+ break
788+ }
789+ }
790+ }
791+ }
792+ if currentTemplateKeyResolved {
793+ resolvedTemplateKeys [keyValues .Key .ID ] = true
794+ ret = append (ret , keyValues .Key )
795+ }
796+ }
797+
798+ resolved = len (resolvedTemplateKeys ) == templateKeyCount
799+ if resolved {
800+ break
801+ }
802+ }
803+ return
804+ }
805+
768806func GetTemplateKeyRelevantKeys (attrView * av.AttributeView , templateKey * av.Key ) (ret []* av.Key ) {
769807 ret = []* av.Key {}
770808 if nil == templateKey || "" == templateKey .Template {
0 commit comments