我们有一个名为PropertyType
的IsPublic
,它使用了Umbraco.TrueFalse
属性编辑器。
需求已更改,此值现在需要由多个复选框表示,这些复选框是使用值Public
,Group1
,Group2
从枚举驱动的。
这一切都按预期工作,但我们希望保存内容编辑器中的10个数千个文档,以便手动填充它们。
在Umbraco中保存文档,我可以看到它在cmsPropertyData
表中创建了一个条目,[ "Public", "Group1", "Group2" ]
列中的值为dataNvarchar
。
我写了一个脚本,根据原始IsPublic
标志的值在该表中插入一行。
但是,在运行此操作后,在Umbraco中打开文档时,不会显示更改。
用于更新的脚本是
DECLARE @HasPublicFlag NVARCHAR(50) = '[ "Public", "Group1", "Group2" ]'
DECLARE @NoPublicFlag NVARCHAR(50) = '[ "Group1", "Group2" ]'
DECLARE @feature INT = (SELECT nodeId FROM cmsContentType WHERE Alias = 'Feature')
--Existing IsPublic flag
DECLARE @featureIsPublic INT = (SELECT id FROM cmsPropertyType WHERE Alias = 'IsPublic' AND contentTypeId = @feature)
--New PropertyType
DECLARE @featureRoleRestriction INT = (SELECT id FROM cmsPropertyType WHERE Alias = 'documentRoleRestriction' AND contentTypeId = @page)
--Get feature document versions that are either newest version or published
;WITH FeatureDocumentsToUpdate AS
(
SELECT d.*, pd.dataInt
FROM cmsDocument d
JOIN cmsPropertyData pd ON pd.versionId = d.versionId
LEFT JOIN cmsPropertyData pd2 ON pd2.versionId = d.versionId AND pd2.propertytypeid = @featureRoleRestriction
WHERE (d.newest = 1 OR d.Published = 1) AND pd.propertytypeid = @featureIsPublic AND pd2.id IS NULL
)
--INSERT INTO cmsPropertyData based on value of existing flag
INSERT INTO cmsPropertyData(contentNodeId, versionId, propertytypeid, dataNvarchar)
SELECT s.nodeId, versionId, @featureRoleRestriction,
CASE WHEN s.dataInt = 0 THEN @NoPublicFlag ELSE @HasPublicFlag END AS NewValue
FROM FeatureDocumentsToUpdate s
是否有其他表需要更新或有更好的方法吗?
我的猜测是你需要重新发布缓存等所有受影响的页面,以便更新并正确填充新值。
使用10,000多个文档,对所有内容进行完全重新发布可能会非常慢。
您还可以尝试更新cmsContentXml表中每个页面的XML以获得正确的值,然后重建站点的检查索引,这应该可以解决问题并且更快一些。这是因为此表的内容用于重建索引以节省速度。
另一种选择是编写一个API控制器任务,你可以运行一次,然后删除以使用Umbraco服务更新所有值,但同样,这将是非常慢的我想你正在谈论的页面量。