1

我目前正在研究一个事件处理程序,它将在保存事件上,将页面的最新修订日期及其组件保存到自定义数据库中,这正在工作,但我面临一些性能问题。

让我给你一个例子,它是如何工作的:

如果保存/更新了一个组件(进行了更改),那么我想在我的自定义数据库中使用该组件更新所有页面。

基本蓝图设置: 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 中的页面吗?

马丁兄弟

4

1 回答 1

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();
于 2013-06-18T11:20:01.643 回答