Tridion RepositoryLocalObject.GetBluePrintChain方法(BluePrint链过滤器)抛出共享项的异常

时间:2012-10-30 00:12:24

标签: tridion tridion-2011

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

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

我的问题与Getting root publication of component有些相关,但却有所不同。我需要理解为什么在共享项上抛出此异常。有人可以解释并分享一个用例来支持它吗?

2 个答案:

答案 0 :(得分:4)

据我所知,当你站在它顶部时,GetBluePrintChain方法意味着向下看BluePrint。因此,在您的情况下,您应该在其拥有的发布上下文中获取该项,然后调用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. 在本地化组件的子出版物中
  3. 在案例1中,blueprintchain将包含单个项目:共享组件。在案例2中,blueprintchain将包含两个项目:共享组件和本地化组件。

答案 1 :(得分:3)

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

共享的任意项调用 GetBluePrintChain()将失败:

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

解决方案是根据Frank的配方首先找到最顶层的本地化项目的父项:

return
  ((RepositoryLocalObject)engine
    .GetObject(
      TemplateUtilities.CreateTcmUriForPublication(
        item.OwningRepository.Id.ItemId,
        item.Id
      )
    )
  ).GetBluePrintChain(
    new BluePrintChainFilter(
      BluePrintChainDirection.Up,
      engine.GetSession()
    )
  ).LastOrDefault();