我正在研究一个事件处理程序,它将在保存事件中将页面的最新修订日期及其组件保存到自定义数据库中,这是有效的,但我遇到了一些性能问题。
让我举个例子,说明它是如何运作的:
如果组件已保存/更新(进行了更改),那么我想在自定义数据库中使用此组件更新所有页面。
基本蓝图设置: 200包含组件 400个组件的翻译出版物(200个固有组件) 500页主页出版物 600个本地站点发布400个固有组件和500个页面
所以假设我们在200中有组件X,这个组件包含在500中的页面中,X本地化为400(我们称之为X(l))并且600中的页面未本地化(即它将使用组件x(l))
现在问我的问题: 在我的保存事件处理程序中,我使用:
检查X(l)包含在哪个页面中var filter = new UsingItemsFilter(component.Session)
{
IncludeLocalCopies = true,
ItemTypes = new[] { ItemType.Page }
};
但这只会给我500页面的引用。 那么我当时所做的事情(感觉有点愚蠢)就是 创建子页面中所有页面的tcm id(通过循环遍历)这个页面固有的(现在我使用了一些伪代码编码):
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中的页面?
Br Martin
答案 0 :(得分: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();