0

我们正在尝试在 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发生得太早,将再次被覆盖。我相信触发这些的相关代码BuildDisplayOrchard.ContentManagement.DefaultContentDisplay. 此处displayType传递的任何参数都是最终被使用的参数。

有没有办法根据某些条件影响代码中的显示类型,或者我们可以使用不同的方法来实现类似的功能?

4

1 回答 1

1

显示类型通常由部件的驱动程序确定。您可能应该做的是引入替代方案:

builder.Describe("Content").OnDisplaying(displaying => {
    if(displaying.Shape.Metadata.DisplayType == "Detail"  && !_authorizer.Authorize(ViewPaidContent) {
        displaying.Shape.Metadata.Alternates.Add("Content__Paywall");      
    }
});

然后,您可以将Content-Paywall.cshtml模板覆盖添加到您的主题中,您应该已经完成​​了。

于 2020-01-16T05:58:05.317 回答