Как получить компонент по имени с помощью основного сервиса?


8

Я использую Tridion 2013 и создаю компоненты в папке в Tridion. Возможно, эти компоненты могут иметь одно и то же имя, что, очевидно, не позволяет Tridion.

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

protected string GetUniqueTitle(string title, string folderId) 
{ 
    return GetUniqueTitle(title, folderId, 1); 
} 

protected string GetUniqueTitle(string original, string folderId, int current) 
{ 
    var title = string.Format("{0} {1}", original, current); 

    var filter = new SearchQueryData 
    { 
     Title = title, 
     IsTitleCaseSensitive = false, 
     ItemTypes = new[] {ItemType.Component}, 
     SearchIn = new LinkToIdentifiableObjectData {IdRef = folderId}, 
     SearchInSubtree = false 
    }; 

    var component = (ComponentData) _client.GetSearchResults(filter).FirstOrDefault(); 

    if (component != null) 
    { 
     return GetUniqueTitle(original, folderId, current + 1); 
    } 

    return title; 
} 

Этот код работает отлично, но я заметил, во время тестирования, если я быстро создам несколько компонентов с тем же именем, используя этот метод, чтобы получить уникальный заголовок, _client.GetSearchResults(...) вернет null для последнего созданного.

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

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

Итак, мой вопрос в том, есть ли другой способ получить компонент по имени или проверить, что данное имя уже существует в папке?

Я мог бы просто попытаться создать компонент и поймать исключение, но это потребует проверки сообщения об исключении, которое кажется немного взломанным, поскольку Core Service всегда выдает WCF FaultException.

Любая помощь, как всегда, очень ценится.

13

Передайте URL WebDAV в параметре id IsExistingObject. В большинстве (если не все) основной сервис принимает идентификатор, вы можете использовать либо URL WebDAV, либо URI TCM.

Обратите внимание, что вы можете прочитать объект, чтобы получить все URL WebDAV вместо URI TCM, просто установите ReadOptions.LoadFlags в LoadFlags.WebDavUrls.


0

Я использовал тот же код ниже -

var filter = new SearchQueryData 
{ 
    Title = title, 
    IsTitleCaseSensitive = false, 
    ItemTypes = new[] {ItemType.Component}, 
    SearchIn = new LinkToIdentifiableObjectData {IdRef = folderId}, 
    SearchInSubtree = false 
}; 

var component = (ComponentData) _client.GetSearchResults(filter).FirstOrDefault(); 

Но она возвращает нуль вместо результата поиска компонента. Я что-то упускаю ?

+1

Пожалуйста, выберите новый вопрос. 06 июл. 152015-07-06 11:05:55