我们正在尝试在 Orchard 1.10 中实现一个通用的可重用付费墙作为 ContentPart。目标是隐藏非付费用户的某些内容,同时保持其详细页面作为预告片可访问。
最初的想法是使用 aShapeTableProvider
检查每个“内容”形状并根据用户的权限更改其显示类型。然后可以根据每个内容自定义我们想要在位置上显示的内容。例如,如果用户无权访问新闻文章,则仅显示 Layout_Summary 而不是完整的布局。
这些方面的东西:
builder.Describe("Content").OnDisplaying(displaying => {
if(displaying.Shape.Metadata.DisplayType == "Detail" && !_authorizer.Authorize(ViewPaidContent) {
displaying.Shape.Metadata.DisplayType == "DetailPaywall";
}
});
--
<Placement>
<Match DisplayType="DetailPaywall">
<Place Parts_Layout="-"/>
...
</Match>
</Placement>
然而,事实证明OnDisplaying
发生得太晚了,位置已经确定并且 ContentDrivers 被调用。OnCreated
发生得太早,将再次被覆盖。我相信触发这些的相关代码BuildDisplay
是Orchard.ContentManagement.DefaultContentDisplay
. 此处displayType
传递的任何参数都是最终被使用的参数。
有没有办法根据某些条件影响代码中的显示类型,或者我们可以使用不同的方法来实现类似的功能?