2013-04-10 53 views
1

我目前正在研究一個事件處理程序,它將在保存事件上保存頁面的最新修訂日期,並將其組件到自定義數據庫中,這是行得通的,米麪臨一些性能問題。使用本地化組件獲取共享頁面

讓我給你舉個例子,對於它是如何工作的:

如果一個組件保存/更新(變更時),那麼我想更新我的自定義數據庫使用該組件的所有頁面。

基本藍圖設置: 200包含組件(200內在的組件)的組件 400翻譯出版 500主出版物頁 600本地站點發布400內在成分和頁面500)

所以讓假設我們在200中有組件X,這個組件包含在500中的一個頁面中,X在400中被本地化(我們稱它爲X(l)),並且600中的頁面不是本地化的(即它將使用組件x (l))

所以現在我的問題: 在我的拯救前夕NT處理,我檢查什麼網頁X(L)包括在通過使用:

var filter = new UsingItemsFilter(component.Session) 
     { 
      IncludeLocalCopies = true, 
      ItemTypes = new[] { ItemType.Page } 
     }; 

但這隻會給我引用頁從500 所以我然後做(這感覺挺傻的) (通過遍歷它們)是固有的這個頁面 創建的兒童出版物的所有頁面中醫ID(現在即時通訊使用一些psuedocodelike編碼):

foreach(var 500page in foundPages) 
foreach(var publication in publications){ 
if(subject.Session.IsExistingObject(
new TcmUri(page.Id.ItemId,page.Id.ItemType,publication.Id.ItemId) 
)) 
{ 
    someListThatWillContainAllChildPagesFrom500.Add(TheAboveTcmUri); 
} 
} 

然後爲每個頁面,檢查的組件頁面,最後將這個狀態保存到我的自定義數據庫中。

所以問題是,有沒有辦法通過使用TOM.NET api(沒有不是CoreServiceClient)來查詢所有使用本地化組件的頁面?

有沒有更好的方法來查找出版物的兒童出版物,所以我只需要檢查childPublication中的頁面?

溴馬丁

+0

感謝您的Tridion相關的問題。如果您還沒有意識到,現在有一個專門的Tridion Stack Exchange站點http://tridion.stackexchange.com/。如果你在那裏發帖 – 2013-04-10 08:30:09

+0

Thx,那麼你可能會得到一個更快/更大的迴應,那裏也不錯! – user1978413 2013-04-10 09:39:45

回答

0

下面的代碼示例應該給你一個具體的本地/本地化項目的共享項目與項目一起。 BluePrintNodesFilter在2013年推出,但在早期版本BluePrintFilter應該以類似的方式工作。

SystemManager systemManager = session.SystemManager; 
BluePrintNodesFilter filter = new BluePrintNodesFilter(session) 
{ 
    BaseColumns = ListBaseColumns.Id, 
    ForItem = page 
}; 
IEnumerable<BluePrintNode> allNodes = systemManager.GetBluePrintNodes(filter); 
IEnumerable<RepositoryLocalObject> sharedAndLocal = (from node in allNodes 
    where node.Item != null 
    where node.Item.OwningRepository.Id == page.OwningRepository.Id 
    select node.Item).ToArray();