【问题标题】:GetListUsingItems with Tridion Core Service returns more items than TOM使用 Tridion 核心服务的 GetListUsingItems 返回比 TOM 更多的项目
【发布时间】:2012-03-19 21:56:48
【问题描述】:

我想通过 Tridion 核心服务使用 GetListUsingItems 方法获取蓝图项的所有子项。与使用 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 核心服务:

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

【问题讨论】:

  • 嗨罗伯特。它不应该影响您返回的组件数量(因为您的源项目是一个组件),但可能值得注意的是您的 R5.3 代码设置了一个“ItemType”行过滤器(这意味着您将只获得组件返回)但您的核心服务代码没有。这可能会影响您的结果总数,但不会影响组件的数量(如您所描述的)。
  • 我添加了 ItemTypes 条件,但仍然获得了相关的组件和子组件。还有其他想法吗?

标签: tridion


【解决方案1】:

你应该使用 BluePrintChainFilterData

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

请注意,您可以指定 Direction 属性。但是,此过滤器不会向您显示共享项目。另外,尽量避免使用 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

【讨论】:

  • 很棒的答案!感谢您提供 2 个示例和精彩的解释。
猜你喜欢
  • 2012-03-24
  • 2013-01-07
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
  • 2012-04-21
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
相关资源
最近更新 更多