我们有一个名为PropertyType
的现有IsPublic
,它使用Umbraco.TrueFalse
属性编辑器。
需求已更改,此值现在需要由多个复选框表示,这些复选框是从枚举驱动的,其值为Public
,Group1
,Group2
。
这一切都按预期进行,但是要保存成千上万的文档,我们希望保存内容编辑器以免手动填充它们。
将文档保存在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
是否还有另一个需要更新的表,或者有更好的方法吗?
答案 0 :(得分:0)
我的猜测是,您需要重新发布所有受影响的页面,以便缓存等正确更新和填充新值。
拥有10,000多个文档,完全重新发布所有内容可能会很慢。
您还可以尝试将cmsContentXml表中每个页面的XML更新为具有正确的值,然后为该站点重建Examine索引,这应该可以解决问题,并且速度更快。这是因为此表的内容用于重建索引以节省速度。
另一种选择是编写一个API控制器任务,您可以运行一次该任务,然后使用Umbraco Services删除该任务以更新所有值,但同样,我认为您的页面数量会非常缓慢在谈论。