(ContentType/DisplayType)-特定于 Orchard 中布局形状的替代品

(ContentType/DisplayType)-specific alternate to Layout shape in Orchard

我用Orchard 1.10.1

是否可以在 Orchard 中创建一个特定于(ContentType/DisplayType)的布局形状替代品?

我需要 Displaytype 详细信息中 CustomContentType 的布局替代方案。

提前致谢。

布局形状似乎没有开箱即用的替代设置:

如果您向下滚动到下一个,Zone 然后您会看到它有一个 OnDisplaying() 事件处理程序,它在末尾添加了替代项。

我不确定是否有我不知道的支持此功能的内置技巧。假设没有任何我也不知道的 "Layout" 的特殊外壳,您可以制作自己的 IShapeTableProvider 并添加一些替代项以满足您的要求。

似乎 a tutorial over on Bertrands blog 解释了如何执行此操作的一些想法。

在评论中它还提到您可以启用形状追踪器的 Url 替代功能,这可能有助于您对此进行排序。

这是一个基于内容类型的布局备用提供程序的示例:

public class LayoutAlternateProvider : ContentHandler
{
    string contentType;
    private readonly IWorkContextAccessor _workContextAccessor;

    protected override void BuildDisplayShape(BuildDisplayContext context)
    {
        if (context.DisplayType == "Detail" && !IsWidget(context.ContentItem))
        {
            context.Layout.Metadata.Alternates.Add("Layout__" + context.ContentItem.ContentType);
        }
    }

    private static bool IsWidget(ContentItem item)
    {
        return item.TypeDefinition.Settings.Any(setting => setting.Key == "Stereotype" && setting.Value == "Widget");
    }
}