2012-03-01 43 views
8

我想使用GetListUsingItems方法和Tridion核心服务获取Blueprint项目的所有子项。与TOM中的旧方式相比,使用Core Service获得不同的结果(更多)。看来我也通过一个Component Link取回了引用我的源组件的其他组件。我是否缺少核心服务中的过滤器选项?使用Tridion核心服务的GetListUsingItems返回的项目多于TOM

外表套上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 

外表套上2011 SP1核心服务:

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

罗伯特嗨的阵列。它不应该影响你回来的组件的数量(因为你的源项目是一个组件),但值得注意的是你的R5.3代码设置了一个'ItemType'行过滤器(这意味着你将只获得组件回来),但你的核心服务代码不。这可能会影响您的结果总数,但不会影响组件的数量(如您所描述的那样)。 – 2012-03-01 12:13:42

+0

我添加了ItemTypes条件,但仍然得到相关的组件和子项。任何其他想法? – robrtc 2012-03-01 12:39:11

回答

6

您应该使用BluePrintChainFilterData

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

请注意,您可以指定方向财产。但是这个过滤器不会显示你共享的项目。另外,尽量避免使用UsingItemsFilterData,因为它是数据库

如果你想,包括共享项目以及重,那么你可以使用BluePrintFilterData

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

您可以在这里指定ForItem财产设置您的项目。它会回报你是这样的:

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

有关系统范围内的清单的好处是,你可以使用GetSystemWideList方法将返回BluePrintNodeData对象而不是XML

+0

太棒了!感谢您提供2个示例和很好的解释。 – robrtc 2012-03-01 16:45:24

相关问题