Comment récupérer un composant par son nom à l'aide du service principal?


8

J'utilise Tridion 2013 et crée des composants dans un dossier dans Tridion. Il est possible que ces composants aient le même nom, ce que Tridion n'autorise évidemment pas.

J'utilise le code suivant pour vérifier si un élément avec un nom existe déjà, et si oui retourne une chaîne de titre unique:

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; 
} 

Ce code fonctionne très bien, mais j'ai remarqué Pendant les tests, si je crée rapidement plusieurs composants avec le même nom, en utilisant cette méthode pour obtenir un titre unique, _client.GetSearchResults(...) retournera null pour le dernier créé. Vraisemblablement parce que GetSearchResults utilise l'index de recherche de Tridion dans les coulisses et cela n'a pas été rempli assez rapidement.

Cela ne devrait pas poser de problème en pratique, mais il serait bon de pouvoir l'éviter complètement. Donc, ma question est, y at-il une autre façon de récupérer un composant par son nom, ou de vérifier qu'un nom donné existe déjà dans un dossier?

Je pourrais simplement essayer de créer le composant et attraper l'exception, mais cela impliquerait de vérifier le message d'exception, qui semble un peu hacky, car le service de base lance toujours un WCF FaultException.

Toute aide, comme toujours, très appréciée.

13

Passez l'URL WebDAV dans le paramètre id de IsExistingObject. La plupart (sinon tous) des endroits où le service principal accepte un identifiant, vous pouvez utiliser une URL WebDAV ou un URI TCM.

Notez que vous pouvez lire un objet pour obtenir toutes les URL WebDAV au lieu des URI TCM, il suffit de définir ReadOptions.LoadFlags sur LoadFlags.WebDavUrls.


0

J'utilise le même code ci-dessous -

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(); 

Mais, il renvoie la valeur null au lieu de résultat de recherche composant. Est-ce que je manque quelque chose?

+1

Veuillez ouvrir une nouvelle question à ce sujet. 06 juil.. 152015-07-06 11:05:55