Skip to content

Commit f084f3d

Browse files
committed
Merge remote-tracking branch 'origin/dev' into dev
2 parents 1b9b7e1 + 699afec commit f084f3d

File tree

2 files changed

+90
-51
lines changed

2 files changed

+90
-51
lines changed

kernel/model/attribute_view.go

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1551,33 +1551,34 @@ func GetBlockAttributeViewKeys(nodeID string) (ret []*BlockAttributeViewKeys) {
15511551
}
15521552

15531553
// 再处理模板字段
1554-
1555-
// 渲染模板
1554+
templateKeys, _ := sql.GetTemplateKeysByResolutionOrder(attrView)
15561555
var renderTemplateErr error
1557-
for _, kv := range keyValues {
1558-
switch kv.Key.Type {
1559-
case av.KeyTypeTemplate:
1560-
if 0 < len(kv.Values) {
1561-
var ial map[string]string
1562-
block := av.GetKeyBlockValue(keyValues)
1563-
if nil != block && !block.IsDetached {
1564-
ial = sql.GetBlockAttrs(block.BlockID)
1565-
}
1566-
if nil == ial {
1567-
ial = map[string]string{}
1568-
}
1569-
if nil == kv.Values[0].Template {
1570-
kv.Values[0] = av.GetAttributeViewDefaultValue(kv.Values[0].ID, kv.Key.ID, nodeID, kv.Key.Type)
1571-
}
1556+
for _, templateKey := range templateKeys {
1557+
for _, kv := range keyValues {
1558+
if kv.Key.ID != templateKey.ID || 1 > len(kv.Values) {
1559+
continue
1560+
}
15721561

1573-
var renderErr error
1574-
kv.Values[0].Template.Content, renderErr = sql.RenderTemplateField(ial, keyValues, kv.Key.Template)
1575-
if nil != renderErr {
1576-
renderTemplateErr = fmt.Errorf("database [%s] template field [%s] rendering failed: %s", getAttrViewName(attrView), kv.Key.Name, renderErr)
1577-
}
1562+
var ial map[string]string
1563+
block := av.GetKeyBlockValue(keyValues)
1564+
if nil != block && !block.IsDetached {
1565+
ial = sql.GetBlockAttrs(block.BlockID)
1566+
}
1567+
if nil == ial {
1568+
ial = map[string]string{}
1569+
}
1570+
if nil == kv.Values[0].Template {
1571+
kv.Values[0] = av.GetAttributeViewDefaultValue(kv.Values[0].ID, kv.Key.ID, nodeID, kv.Key.Type)
1572+
}
1573+
1574+
var renderErr error
1575+
kv.Values[0].Template.Content, renderErr = sql.RenderTemplateField(ial, keyValues, kv.Key.Template)
1576+
if nil != renderErr {
1577+
renderTemplateErr = fmt.Errorf("database [%s] template field [%s] rendering failed: %s", getAttrViewName(attrView), kv.Key.Name, renderErr)
15781578
}
15791579
}
15801580
}
1581+
15811582
if nil != renderTemplateErr {
15821583
util.PushErrMsg(fmt.Sprintf(Conf.Language(44), util.EscapeHTML(renderTemplateErr.Error())), 30000)
15831584
}

kernel/sql/av.go

Lines changed: 67 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
768806
func GetTemplateKeyRelevantKeys(attrView *av.AttributeView, templateKey *av.Key) (ret []*av.Key) {
769807
ret = []*av.Key{}
770808
if nil == templateKey || "" == templateKey.Template {

0 commit comments

Comments
 (0)