Мне нужно изменить тип записи почти 700 статей в лайтнинге.

Я пытаюсь использовать этот подход, чтобы изменить статьи на черновик:

//STEP 1: draft the articles 
List<knowledge__kav> arts = [SELECT Id, KnowledgeArticleId, IsVisibleInPrm, PublishStatus FROM knowledge__kav WHERE PublishStatus ='Online' AND RecordTypeId= null LIMIT 5];
List<string> newIds = new List<string>();
system.debug('arts:: ' + arts);

for(knowledge__kav art: arts){
String articleId = art.KnowledgeArticleId;
system.debug('articleID:: ' + articleId);
String id = KbManagement.PublishingService.editOnlineArticle (articleId, false);
newIds.add(id);
}

Но я получаю эту ошибку:

Вы не можете выполнить это действие. Убедитесь, что действие допустимо для текущего состояния статьи и что у вас есть разрешение на его выполнение.

Я сомневаюсь, что я действительно могу использовать метод KbManagement.PublishingService.editOnlineArticle здесь.

1
smukov 17 Окт 2019 в 11:44

1 ответ

Эта ошибка обычно возникает, если вы вызываете метод editOnlineArticle(..) для статей, у которых уже есть версия draft. Поэтому в этом случае вам сначала нужно убедиться, что в этих статьях нет существующих черновиков, либо удалив их, либо проигнорировав их и вообще не выполняя метод editOnlineArticle(..) - это зависит от того, чего вы пытаетесь достичь. .

Ниже приведен теоретический пример того, как это сделать, если вы хотите удалить существующие draft статьи и создать новые (я не пробовал запускать этот код):

Set<Id> knowledgeArticleIds = new Set<Id>();

// get articles that you want to create new drafts for
for (Knowledge__kav kav : [
    SELECT Id, KnowledgeArticleId
    FROM Knowledge__kav
    WHERE IsMasterLanguage = true 
    AND PublishStatus = 'Online'
    AND RecordTypeId = null
    LIMIT 5
]){
    knowledgeArticleIds.add(kav.KnowledgeArticleId);
}

// check if they already have a draft version and delete the drafts if they exist
for (Knowledge__kav kav : [
    SELECT Id, KnowledgeArticleId
    FROM Knowledge__kav
    WHERE IsMasterLanguage = true 
    AND PublishStatus = 'Draft'  
    AND RecordTypeId = null
    AND KnowledgeArticleId IN :knowledgeArticleIds
]){
    KbManagement.PublishingService.deleteDraftArticle(kav.KnowledgeArticleId);
}

// now you can create new drafts
for(Id kaID : knowledgeArticleIds){
    KBManagement.PublishingService.editOnlineArticle(kaID, false);
}

Имейте в виду, что код был бы немного другим, если бы вы создавали черновики для переводов (например, IsMasterLanguage = false), но базовая логика та же.

Также имейте в виду, что в оптимальном решении вы не будете использовать LIMIT 5 в первом запросе. Вместо этого вы получите набор всех KnowledgeArticleIds, для которых вы хотите создать черновики статей, а затем передадите этот набор идентификаторов 5 на пакет Queueable, для того, чтобы избежать ограничений.

0
smukov 17 Окт 2019 в 12:02
Могу ли я узнать, как обновить эту статью? Откуда мы должны вызывать вершину. Мы делаем то же самое, нам нужно обновить несколько тысяч записей, и я создал триггер, который вызывает класс вершины и выполняет editOnlineArticle, update и затем Publish. Поэтому для массового обновления я пытаюсь использовать загрузчик данных, для тестирования я передал только один идентификатор загрузчику данных и сделал обновление, но он выдает ошибку Only draft articles can be update : Publication Status
 – 
user81642
18 Июн 2020 в 17:19
Я не думаю, что вы можете сделать это в триггере, поскольку записи могут быть заблокированы самим триггером. Вероятно, лучше всего добавить это в пакет или в очередь, а затем запустить его из консоли разработчика, если это одноразовая вещь.
 – 
smukov
18 Июн 2020 в 18:47