5

我正在尝试获取继承 RepositoryLocalObject(例如组件)的父项列表。因此,如果我有一个带有组件 tcm:1-80 的 pub ID 1 和一个子 pub ID 2,那么这个组件在子 pub 中共享为 tcm:2-80。所以我想得到 tcm:2-80 的父母,或者树上的任何东西向上移动。

我已经在组件的本地副本上尝试了 GetBluePrintChain() 方法,它可以正常工作。但是,在共享组件上,它返回 InvalidActionException:“此项目是共享的”。该文档提到此异常是在共享项目上引发的。但这有什么意义呢?显然,如果任何具有超出自身的蓝图链的项目将被共享(或成为本地副本)。所以对我来说,让这个方法在有蓝图链的东西上抛出异常是没有意义的。似乎很矛盾。

我的问题与获取组件的根发布有些相关,但它有所不同。我需要了解为什么在共享项目上会引发此异常。有人可以解释一下并分享一个用例来支持它吗?

4

2 回答 2

4

据我所知,GetBluePrintChain当您站在蓝图顶部时,这些方法旨在俯视蓝图。因此,在您的情况下,您应该在其拥有的发布上下文中获取该项目,然后调用GetBluePrintChain.

Item item = package.GetByName("Component");
Component component = new Component(item.GetAsXmlDocument().DocumentElement,
                                    engine.GetSession());
TcmUri id = TemplateUtilities.CreateTcmUriForPublication(
        component.OwningRepository.Id.ItemId, component.Id);

var blueprintchain = ((Component)engine.GetObject(id)).GetBluePrintChain();

package.PushItem(package.CreateStringItem(ContentType.Text, 
                                          blueprintchain.ToString()));
package.PushItem(package.CreateStringItem(ContentType.Text,
                             ""+System.Linq.Enumerable.Count(blueprintchain)));
foreach (var item in blueprintchain)
{
    package.PushItem(package.CreateTridionItem(ContentType.Component, item));
}

我只是在两种情况下将上述 C# 片段作为 TBB 运行:

  1. 在共享组件的子出版物中
  2. 在本地化组件的子出版物中

在情况 1 中,blueprintchain将包含一个项目:共享组件。在情况 2 中,blueprintchain将包含两个项目:共享组件和本地化组件。

于 2012-10-30T13:35:42.390 回答
3

总结上面的答案,这是“项目已共享”问题的实际解决方法:

为碰巧共享的任意项目调用GetBluePrintChain()将失败:

return
  item.GetBluePrintChain(
    new BluePrintChainFilter(
      BluePrintChainDirection.Up,
      engine.GetSession()
    )
  ).LastOrDefault();

解决方案是按照弗兰克的食谱首先找到最顶级的本地化项目的父项:

return
  ((RepositoryLocalObject)engine
    .GetObject(
      TemplateUtilities.CreateTcmUriForPublication(
        item.OwningRepository.Id.ItemId,
        item.Id
      )
    )
  ).GetBluePrintChain(
    new BluePrintChainFilter(
      BluePrintChainDirection.Up,
      engine.GetSession()
    )
  ).LastOrDefault();
于 2012-11-14T08:16:15.653 回答