我正在尝试获取继承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有些相关,但却有所不同。我需要理解为什么在共享项上抛出此异常。有人可以解释并分享一个用例来支持它吗?
答案 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中,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();