GetListUsingItems с Tridion Core Service возвращает больше элементов, чем TOM

Я хочу, чтобы все дети элемента ********* использовали подход GetListUsingItems с Tridion Core Service. Я возвращаю разные результаты (больше) с помощью Core Service, чем со старым способом в 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;
 }
1 ответ

Вы должны использовать BluePrintChainFilterData​​strong > :

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

Обратите внимание, что вы можете указать свойство Направление. Этот фильтр, однако, не покажет вам общие элементы. Также старайтесь избегать использования UseItemsFilterData, поскольку он тяжелый в базе данных

Если вы хотите также включить общие элементы, вы можете использовать *******************​​strong > :

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

Здесь вы можете указать свойство ForItem, чтобы установить свой элемент. Он вернет вам что-то вроде этого:

<tcm:****************** managed="1" xmlns:tcm="http://www.tridion.com/ContentManager/5.0" xmlns:xlink="http://www.w3.org/1999/xlink">
 <tcm:************* id="tcm:0-3-1" title="Test" icon="T1L0P0">
 
 </tcm:*************>
 <tcm:************* id="tcm:0-172-1" title="test_child" icon="T1L0P0">
 <tcm:parents>
 
 </tcm:parents>
 
 </tcm:*************>
</tcm:******************>

Хорошо, что в списке системных систем вы можете использовать метод GetSystemWideList, который вернет вам массив объектов *****************​​strong > вместо XML

licensed under cc by-sa 3.0 with attribution.