Orchard基于Tag替代

时间:2013-06-20 22:01:43

标签: orchardcms orchardcms-1.6

我想基于其标记值为内容项创建替代项。

例如,我想创建一个名为List-ProjectionPage-tags-special

的备用项

搜索网络会指示我实施新的ShapeDisplayEvents

因此,我有

public class TagAlternatesFactory : ShapeDisplayEvents
{
    public TagAlternatesFactory()
    {
    }

    public override void Displaying(ShapeDisplayingContext context)
    {
    }
}

Displaying方法中,我相信我需要检查context.Shape中的contentItem并根据它创建一个备用名称(假设它已将TagsPart添加到内容项中)。

但是,我该怎么办呢?如何添加备用名称?是否需要创建新的备用类型?果园会知道找List-ProjectionPage-tags-special吗?

1 个答案:

答案 0 :(得分:2)

我从Bertrand的评论中得到了启示,并查看了一些Orchard来源的方向。

这是我的实施:

public class TagAlternatesFactory : ShapeDisplayEvents
{
    public override void Displaying(ShapeDisplayingContext context)
    {
        context.ShapeMetadata.OnDisplaying(displayedContext =>
        {
            var contentItem = displayedContext.Shape.ContentItem;
            var contentType = contentItem.ContentType;

            var parts = contentItem.Parts as IEnumerable<ContentPart>;
            if (parts == null) return;

            var tagsPart = parts.FirstOrDefault(part => part is TagsPart) as TagsPart;
            if (tagsPart == null) return;

            foreach (var tag in tagsPart.CurrentTags)
            {
                displayedContext.ShapeMetadata.Alternates.Add(
                                    String.Format("{0}__{1}__{2}__{3}", 
displayedContext.ShapeMetadata.Type, (string)contentType, "tag", tag.TagName)); //See update
            }
        });
    }
}

这允许基于标记值的备用视图。因此,如果您有一个要应用特定样式的项目页面,则只需创建名为ProjectionPage_tag_special的备用视图,并且只要您希望投影页面使用它,只需添加{{1标记到它。

<强>更新 我将special添加到备用名称中,以便可以覆盖特定的形状(如List-ProjectionPage)