Перенести PropertyData в новый PropertyType - PullRequest
0 голосов
/ 21 февраля 2019

У нас есть существующий PropertyType с именем IsPublic, который использует редактор свойств Umbraco.TrueFalse.

Требования изменились, и теперь это значение должно быть представлено несколькими флажками, которые запускаются из Enum сЗначения 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

Есть ли другая таблица(s) которые нужно обновить или есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 05 марта 2019

Полагаю, вам нужно будет переиздать все затронутые страницы для кэшей и т. Д., Чтобы правильно обновить их и заполнить новыми значениями.

При наличии более 10000 документов полная переиздание всего может бытьдовольно медленно.

Вы также можете попробовать обновить XML для каждой страницы в таблице cmsContentXml, чтобы получить правильные значения, а затем перестроить индексы Examine для сайта, что должно помочь, и сделать это немного быстрее.,Это связано с тем, что содержимое этой таблицы используется для перестроения индексов для экономии на скорости.

Другой вариант - написать задачу контроллера API, которую можно запустить один раз, а затем удалить, чтобы обновить все значения с помощьюUmbraco Services, но опять же, это будет довольно медленно, я думаю, об объеме страниц, о которых вы говорите.

...