Tridion RepositoryLocalObject.GetBluePrintChain方法(BluePrintChainFilter)thows共享项异常
我试图获取RepositoryLocalObject(例如组件)继承自的父项列表。因此,如果我有一个包含组件tcm:1-80的发布ID 1和一个子发布ID 2,那么这个组件在子发布中作为tcm:2-80共享。所以我想让tcm:2-80的父母,或者树上的任何东西向上移动 我在一个组件的本地副本上尝试了GetBluePrintChain()方法,该方法运行良好。然而,在共享组件上,它返回一个InvalidActionException:“此项是共享的”。文档提到此异常是在共享项上引发的。但这有什么意义呢?很明显,如果任何项目的蓝图链超出其自身范围,则该项目将被共享(或是本地副本)。所以对我来说,让这个方法在有蓝图链的东西上抛出异常是没有意义的。这似乎自相矛盾Tridion RepositoryLocalObject.GetBluePrintChain方法(BluePrintChainFilter)thows共享项异常,tridion,tridion-2011,Tridion,Tridion 2011,我试图获取RepositoryLocalObject(例如组件)继承自的父项列表。因此,如果我有一个包含组件tcm:1-80的发布ID 1和一个子发布ID 2,那么这个组件在子发布中作为tcm:2-80共享。所以我想让tcm:2-80的父母,或者树上的任何东西向上移动 我在一个组件的本地副本上尝试了GetBluePrintChain()方法,该方法运行良好。然而,在共享组件上,它返回一个InvalidActionException:“此项是共享的”。文档提到此异常是在共享项上引发的。但这有什么意
我的问题有点像,但不同。我需要理解为什么在共享项上引发此异常。有人能解释一下或者分享一个用例来支持它吗?据我所知,
GetBluePrintChain
方法是用来在你站在蓝图顶端时向下看蓝图的。因此,在您的情况下,您应该在其所属的发布上下文中获取该项,然后调用GetBluePrintChain
Item=package.GetByName(“组件”);
组件组件=新组件(item.GetAsXmlDocument().DocumentElement,
engine.GetSession());
TcmUri id=TemplateUtilities.CreateTcmUriForPublication(
component.OwningRepository.Id.ItemId,component.Id);
var blueprintchain=((组件)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项目)
{
package.PushItem(package.CreateTridionItem(ContentType.Component,item));
}
我只是在两种情况下将上述C#片段作为TBB运行:
在案例1中,
blueprintchain
将包含一个项目:共享组件。在案例2中,blueprintchain
将包含两个项目:共享组件和本地化组件。为了总结上述答案,下面是一个关于“项目是共享的”问题的实用解决方案:
为恰好共享的任意项目调用GetBluePrintChain()将失败:
返回
item.GetBluePrintChain(
新BluePrintChainFilter(
蓝图,向上,
engine.GetSession()
)
).LastOrDefault();
解决方案是根据Frank的配方首先找到最顶级本地化项目的父项:
返回
((RepositoryLocalObject)引擎
.GetObject(
TemplateUtilities.CreateTcmUriForPublication(
item.OwningRepository.Id.ItemId,
项目Id
)
)
).GetBluePrintChain(
新BluePrintChainFilter(
蓝图,向上,
engine.GetSession()
)
).LastOrDefault();
ah,但如果指定过滤器,则可以设置向上或向下的方向。因此,我希望能够获取一个共享项并将该链放到树上:BluePrintChainFilter bpfilter=new BluePrintChainFilter(BluePrintChainDirection.up,engine.GetSession());项目可以在当前上下文存储库中进行本地化,在这种情况下,您可以向上或向下查找,并在筛选器中指定方向。无论哪种方式,您似乎只能在项目所属存储库的上下文中访问项目的蓝图链。