Orchard Taxonomies Shape由DisplayType替换

时间:2013-02-05 12:00:02

标签: asp.net-mvc orchardcms orchardcms-1.6

我正在使用形状跟踪器,以便使用名为location的某个分类字段的备用视图。但是,与其他形状不同,在此案例摘要或详细信息中,替代品不提供不同显示类型的选项。因此,通过更改1,您可以更改另一个。我需要能够独立完成它们。

我创建了一个视图,请参阅下面的 Fields.Contrib.TaxonomyField-Location.cshtml ,但正如我所说,如果显示类型是详细信息或摘要,则显示相同。

如何克服这一点。

感谢Jon

1 个答案:

答案 0 :(得分:4)

I had the same problem not long ago。您可以通过实施ShapeDisplayEvents课程来提供自己的替代课程。

这是一个实现,它根据内容类型,显示类型或两者提供替代选项:

public class PartContentTypeAlternateFactory : ShapeDisplayEvents {
    public override void Displaying(ShapeDisplayingContext context) {
        context.ShapeMetadata.OnDisplaying(displayedContext => {
            var shapeType = displayedContext.ShapeMetadata.Type;
            var contentItem = displayedContext.Shape.ContentItem;
            var displayType = displayedContext.ShapeMetadata.DisplayType;
            var contentType = contentItem.ContentType;
            displayedContext.ShapeMetadata.Alternates.Add(
                String.Format("{0}__{1}", shapeType, displayType));
            displayedContext.ShapeMetadata.Alternates.Add(
                String.Format("{0}__{1}__{2}", shapeType, (string)contentType, displayType));
            });
    }
}

你最终会在形状跟踪器中出现一些额外的替代品,如下所示:

enter image description here

现在您可以使用名为Fields.Contrib.TaxonomyField-Location-SummaryFields.Contrib.TaxonomyField-Location-Detail等的替代方案。您可以扩展此类以添加您想要的任何替代项。

修改

我没有意识到你不能轻易获得字段名称,所以尝试这样的事情 - 它做的事情类似于UrlAlternatesFactory所做的事情,即它循环现有的替代品并添加displayType给他们。这应该为您提供包含字段名称和显示类型的替代方案。

public class PartContentTypeAlternateFactory : ShapeDisplayEvents {
    public override void Displaying(ShapeDisplayingContext context) {
        context.ShapeMetadata.OnDisplaying(displayedContext => {
            var alternates = displayedContext.ShapeMetadata.Alternates.Select(a => a + "__" + displayedContext.ShapeMetadata.DisplayType);
            displayedContext.ShapeMetadata.Alternates = displayedContext.ShapeMetadata.Alternates.Union(alternates).ToList();
        });
    }
}