2012-03-01 10 views
8

Voglio ottenere tutti i figli di un elemento di modello utilizzando l'approccio GetListUsingItems con il servizio principale di Tridion. Ricevo diversi risultati (di più) con il servizio principale rispetto al vecchio modo in TOM. Sembra che torni anche altri componenti che fanno riferimento al mio componente sorgente tramite un collegamento componente. Mi manca un'opzione di filtro nel servizio principale?GetListUsingItems con servizio Tridion Core restituisce più articoli di TOM

Tridion 5.3:

Function GetLocalizedItemNodes(itemUri) 
    Dim tridionItem : set tridionItem = tdse.GetObject(itemUri,1) 
    Dim rowFilter : set rowFilter = tdse.CreateListRowFilter() 
    call rowFilter.SetCondition("ItemType", GetItemType(itemUri)) 
    call rowFilter.SetCondition("InclLocalCopies", true) 
    Dim usingItemsXml : usingItemsXml = tridionItem.Info.GetListUsingItems(1919, rowFilter) 

    Dim domDoc : set domDoc = GetNewDOMDocument() 
    domDoc.LoadXml(usingItemsXml) 
    Dim nodeList : set nodeList = domDoc.SelectNodes("/tcm:ListUsingItems/tcm:Item[@CommentToken='LocalCopy']") 

    set tridionItem = nothing 
    set domDoc = nothing 
    set GetLocalizedItemNodes = nodeList 
End Function 

Tridion 2011 SP1 Servizio principale:

private XElement GetLocalizedItems(string itemUri) 
    { 
     XElement usingXML = null; 
     try 
     { 
      CoreServiceClient client = new CoreServiceClient(); 
      client.ClientCredentials.Windows.ClientCredential.UserName = ConfigurationManager.AppSettings["impersonationUser"].ToString(); // "administrator"; 
      client.ClientCredentials.Windows.ClientCredential.Password = ConfigurationManager.AppSettings["impersonationPassword"].ToString(); 
      client.ClientCredentials.Windows.ClientCredential.Domain = ConfigurationManager.AppSettings["impersonationDomain"].ToString(); 

      // original code from http://www.tridiondeveloper.com/getting-used-items-using-the-core-service 
      // Create a filter 
      UsingItemsFilterData usingItemsFilterData = new UsingItemsFilterData 
      { 
       BaseColumns = ListBaseColumns.IdAndTitle, // to specify the detail in the XML 
       IncludeLocalCopies = true, 
       ItemTypes = new[] { ItemType.Component } 
      }; 
      // Get the XML by calling .GetListXml on the client (assumes you have a 'client' object already) 
      usingXML = client.GetListXml(itemUri, usingItemsFilterData); 

     } 
     catch (Exception ex) 
     { 
      throw; 
     } 
     return usingXML; 
    } 
+1

Hi Robert. Non dovrebbe influenzare il numero di Componenti che si stanno recuperando (come il tuo oggetto sorgente è un Componente), ma potrebbe valere la pena notare che il tuo codice R5.3 imposta un filtro di riga 'ItemType' (significa che otterrai solo Componenti indietro) ma il tuo codice di servizio principale non lo fa. Ciò potrebbe influire sul numero totale di risultati, ma non sulla quantità di componenti (come descritto). –

+0

Ho aggiunto la condizione ItemTypes ma ottengo anche i relativi componenti e figli. Altre idee? – robrtc

risposta

6

Si dovrebbe usare BluePrintChainFilterData:

BluePrintChainFilterData filter = new BluePrintChainFilterData(); 
filter.Direction = BluePrintChainDirection.Down; 
var result = ClientAdmin.GetListXml("tcm:3-1905", filter); 

prega di notare che è possibile specificare Direzione proprietà. Questo filtro, tuttavia, non ti mostrerà oggetti condivisi. Inoltre, cercare di evitare l'uso di UsingItemsFilterData come è pesante su base di dati

Se si desidera includere elementi condivisi pure, quindi è possibile utilizzare BluePrintFilterData:

BluePrintFilterData filter = new BluePrintFilterData(); 
filter.ForItem = new LinkToRepositoryLocalObjectData{ IdRef = "tcm:3-1905"}; 
var listXml = ClientAdmin.GetSystemWideListXml(filter); 
var list = ClientAdmin.GetSystemWideList(filter); 

È possibile specificare ForItem proprietà qui per impostare il tuo articolo. Lo restituirà qualcosa di simile:

<tcm:ListBluePrintNodes Managed="1" xmlns:tcm="http://www.tridion.com/ContentManager/5.0" xmlns:xlink="http://www.w3.org/1999/xlink"> 
    <tcm:BluePrintNode ID="tcm:0-3-1" Title="Test" Icon="T1L0P0"> 
    <tcm:Item ID="tcm:3-1905" Title="Test multimedia component" ItemType="16" IsShared="False" IsLocalized="False" IsPublished="False" LockType="0" LockUser="tcm:0-0-0" Icon="T16L0P0Mgif"></tcm:Item> 
    </tcm:BluePrintNode> 
    <tcm:BluePrintNode ID="tcm:0-172-1" Title="test_child" Icon="T1L0P0"> 
    <tcm:Parents> 
     <tcm:Parent xlink:href="tcm:0-3-1" xlink:title="Test" Priority="1"></tcm:Parent> 
    </tcm:Parents> 
    <tcm:Item ID="tcm:172-1905" Title="Test multimedia component" ItemType="16" IsShared="True" IsLocalized="False" IsPublished="False" LockType="0" LockUser="tcm:0-0-0" Icon="T16L0P0Mgif"></tcm:Item> 
    </tcm:BluePrintNode> 
</tcm:ListBluePrintNodes> 

La cosa buona di sistema di elenco di tutto è che è possibile utilizzare GetSystemWideList metodo che restituirà si schiera di BluePrintNodeData oggetti invece di XML

+0

Risposta stupenda! Grazie per aver fornito 2 esempi e la grande spiegazione. – robrtc

Problemi correlati