🎨 The database template field supports using other template fields https://github.com/siyuan-note/siyuan/issues/15517

This commit is contained in:
Daniel 2025-08-14 11:19:27 +08:00
parent dd3f5cfacf
commit 699afec920
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
2 changed files with 91 additions and 52 deletions

View file

@ -1551,13 +1551,14 @@ func GetBlockAttributeViewKeys(nodeID string) (ret []*BlockAttributeViewKeys) {
} }
// 再处理模板字段 // 再处理模板字段
templateKeys, _ := sql.GetTemplateKeysByResolutionOrder(attrView)
// 渲染模板
var renderTemplateErr error var renderTemplateErr error
for _, templateKey := range templateKeys {
for _, kv := range keyValues { for _, kv := range keyValues {
switch kv.Key.Type { if kv.Key.ID != templateKey.ID || 1 > len(kv.Values) {
case av.KeyTypeTemplate: continue
if 0 < len(kv.Values) { }
var ial map[string]string var ial map[string]string
block := av.GetKeyBlockValue(keyValues) block := av.GetKeyBlockValue(keyValues)
if nil != block && !block.IsDetached { if nil != block && !block.IsDetached {
@ -1577,7 +1578,7 @@ func GetBlockAttributeViewKeys(nodeID string) (ret []*BlockAttributeViewKeys) {
} }
} }
} }
}
if nil != renderTemplateErr { if nil != renderTemplateErr {
util.PushErrMsg(fmt.Sprintf(Conf.Language(44), util.EscapeHTML(renderTemplateErr.Error())), 30000) util.PushErrMsg(fmt.Sprintf(Conf.Language(44), util.EscapeHTML(renderTemplateErr.Error())), 30000)
} }

View file

@ -509,7 +509,7 @@ func fillAttributeViewAutoGeneratedValues(attrView *av.AttributeView, collection
} }
} }
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) { func fillAttributeViewTemplateValues(attrView *av.AttributeView, collection av.Collection, ials map[string]map[string]string, items map[string][]*av.KeyValues) (err error) {
existTemplateField := false existTemplateField := false
for _, kVals := range attrView.KeyValues { for _, kVals := range attrView.KeyValues {
if av.KeyTypeTemplate == kVals.Key.Type { if av.KeyTypeTemplate == kVals.Key.Type {
@ -521,14 +521,11 @@ func fillAttributeViewTemplateValues(attrView *av.AttributeView, collection av.C
return return
} }
var renderTemplateErr error templateKeys, _ := GetTemplateKeysByResolutionOrder(attrView)
for _, templateKey := range templateKeys {
for _, item := range collection.GetItems() { for _, item := range collection.GetItems() {
for _, value := range item.GetValues() { value := item.GetValue(templateKey.ID)
itemID := item.GetID() keyValues := items[item.GetID()]
switch value.Type {
case av.KeyTypeTemplate: // 渲染模板字段
keyValues := items[itemID]
var ial map[string]string var ial map[string]string
blockVal := item.GetBlockValue() blockVal := item.GetBlockValue()
if nil != blockVal { if nil != blockVal {
@ -537,8 +534,8 @@ func fillAttributeViewTemplateValues(attrView *av.AttributeView, collection av.C
if nil == ial { if nil == ial {
ial = map[string]string{} ial = map[string]string{}
} }
content, renderErr := RenderTemplateField(ial, keyValues, value.Template.Content) content, renderErr := RenderTemplateField(ial, keyValues, value.Template.Content)
value.Template.Content = content
if nil != renderErr { if nil != renderErr {
key, _ := attrView.GetKey(value.KeyID) key, _ := attrView.GetKey(value.KeyID)
keyName := "" keyName := ""
@ -547,14 +544,11 @@ func fillAttributeViewTemplateValues(attrView *av.AttributeView, collection av.C
} }
err = fmt.Errorf("database [%s] template field [%s] rendering failed: %s", getAttrViewName(attrView), keyName, renderErr) err = fmt.Errorf("database [%s] template field [%s] rendering failed: %s", getAttrViewName(attrView), keyName, renderErr)
} }
}
if nil != err { value.Template.Content = content
renderTemplateErr = err items[item.GetID()] = append(keyValues, &av.KeyValues{Key: templateKey, Values: []*av.Value{value}})
} }
} }
}
err = renderTemplateErr
return return
} }
@ -765,6 +759,50 @@ func manualSort(view *av.View, collection av.Collection) {
collection.SetItems(items) collection.SetItems(items)
} }
func GetTemplateKeysByResolutionOrder(attrView *av.AttributeView) (ret []*av.Key, resolved bool) {
ret = []*av.Key{}
resolvedTemplateKeys := map[string]bool{}
for i := 0; i < 7; i++ {
templateKeyCount := 0
for _, keyValues := range attrView.KeyValues {
if av.KeyTypeTemplate != keyValues.Key.Type {
continue
}
templateKeyCount++
vars, err := getTemplateVars(keyValues.Key.Template)
if nil != err {
resolvedTemplateKeys[keyValues.Key.ID] = true
ret = append(ret, keyValues.Key)
continue
}
currentTemplateKeyResolved := true
for _, kValues := range attrView.KeyValues {
if gulu.Str.Contains(kValues.Key.Name, vars) {
if av.KeyTypeTemplate == kValues.Key.Type {
if _, ok := resolvedTemplateKeys[kValues.Key.ID]; !ok {
currentTemplateKeyResolved = false
break
}
}
}
}
if currentTemplateKeyResolved {
resolvedTemplateKeys[keyValues.Key.ID] = true
ret = append(ret, keyValues.Key)
}
}
resolved = len(resolvedTemplateKeys) == templateKeyCount
if resolved {
break
}
}
return
}
func GetTemplateKeyRelevantKeys(attrView *av.AttributeView, templateKey *av.Key) (ret []*av.Key) { func GetTemplateKeyRelevantKeys(attrView *av.AttributeView, templateKey *av.Key) (ret []*av.Key) {
ret = []*av.Key{} ret = []*av.Key{}
if nil == templateKey || "" == templateKey.Template { if nil == templateKey || "" == templateKey.Template {