将PropertyData迁移到新的PropertyType

时间:2019-02-21 16:26:49

标签: umbraco umbraco7

我们有一个名为PropertyType的现有IsPublic,它使用Umbraco.TrueFalse属性编辑器。

需求已更改,此值现在需要由多个复选框表示,这些复选框是从枚举驱动的,其值为PublicGroup1Group2

这一切都按预期进行,但是要保存成千上万的文档,我们希望保存内容编辑器以免手动填充它们。

将文档保存在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

是否还有另一个需要更新的表,或者有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

我的猜测是,您需要重新发布所有受影响的页面,以便缓存等正确更新和填充新值。

拥有10,000多个文档,完全重新发布所有内容可能会很慢。

您还可以尝试将cmsContentXml表中每个页面的XML更新为具有正确的值,然后为该站点重建Examine索引,这应该可以解决问题,并且速度更快。这是因为此表的内容用于重建索引以节省速度。

另一种选择是编写一个API控制器任务,您可以运行一次该任务,然后使用Umbraco Services删除该任务以更新所有值,但同样,我认为您的页面数量会非常缓慢在谈论。