2012-03-01 8 views
8

Deseo obtener todos los elementos hijos de un elemento Blueprint utilizando el enfoque GetListUsingItems con el servicio Tridion Core. Obtengo resultados diferentes (más) con el Servicio principal que con la forma antigua en TOM. Parece que también recibo otros Componentes que hacen referencia a mi Componente fuente a través de un Enlace de componente. ¿Me falta una opción de filtro en el Servicio principal?GetListUsingItems con Tridion Core Service devuelve más elementos que 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 Servicio básico:

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

Hola Robert. No debería afectar la cantidad de Componentes que está recibiendo (ya que su elemento de origen es un Componente), pero podría valer la pena señalar que su código R5.3 establece un filtro de fila 'Tipo de elemento' (lo que significa que solo obtendrá Componentes) de vuelta) pero su código de servicio central no. Esto puede afectar su número total de resultados, pero no la cantidad de Componentes (como usted describe). –

+0

Agregué la condición ItemTypes pero todavía obtengo los componentes y los elementos relacionados también. ¿Alguna otra idea? – robrtc

Respuesta

6

Debe utilizar BluePrintChainFilterData:

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

Tenga en cuenta que puede especificar Dirección propiedad. Sin embargo, este filtro no le mostrará elementos compartidos. Además, trate de evitar el uso de UsingItemsFilterData ya que es pesado en la base de datos

Si desea incluir elementos compartidos y, a continuación, puede utilizar BluePrintFilterData:

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

Puede especificar ForItem propiedad aquí para establecer tu artículo Se le regresar algo como esto:

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

Lo bueno de sistema de lista amplia es que se puede utilizar GetSystemWideList método que le volverá gama de BluePrintNodeData objetos en lugar de XML

+0

¡Respuesta impresionante! Gracias por proporcionar 2 ejemplos y la gran explicación. – robrtc

Cuestiones relacionadas