Orchardcms 基于标签的果园轮换

Orchardcms 基于标签的果园轮换,orchardcms,orchardcms-1.6,Orchardcms,Orchardcms 1.6,我想根据内容项的标记值为其创建替代项 例如,我想创建一个名为List ProjectionPage tags special 搜索网络将指导我实现一个新的ShapeDisplayEvents 因此,我有 public class TagAlternatesFactory : ShapeDisplayEvents { public TagAlternatesFactory() { } public override void Displaying(ShapeDis

我想根据内容项的标记值为其创建替代项

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

搜索网络将指导我实现一个新的
ShapeDisplayEvents

因此,我有

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

    public override void Displaying(ShapeDisplayingContext context)
    {
    }
}
Displaying
方法中,我认为我需要从context.Shape中检查contentItem,并根据它创建一个备用名称(假设它将TagsPart添加到content项中)


但是,我该怎么处理它呢?如何添加候补者的名称?这就是创建新的替代类型所需的全部内容吗?乌节会不会知道如何查找
列表项目页面标签特别的

以下是我的实现:

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
            }
        });
    }
}
公共类标记AlternateSFactory:ShapeDisplayEvents
{
公共覆盖无效显示(ShapeDisplayingContext)
{
context.ShapeMetadata.ondisplay(displayedContext=>
{
var contentItem=displayedContext.Shape.contentItem;
var contentType=contentItem.contentType;
var parts=contentItem.parts作为IEnumerable;
if(parts==null)返回;
var tagsPart=parts.FirstOrDefault(part=>part为tagsPart)作为tagsPart;
if(tagsPart==null)返回;
foreach(tagsPart.CurrentTags中的var标记)
{
displayedContext.ShapeMetadata.Alternates.Add(
String.Format(“{0}{1}{2}{3}”,
displayedContext.ShapeMetadata.Type,(string)contentType,“tag”,tag.TagName));//参见更新
}
});
}
}
这允许基于标记值的备用视图。因此,如果您有一个要应用特定样式的项目页面,您只需使用名称
ProjectionPage\u tag\u special
创建备用视图,并且只要在任何时候您想要一个投影页面使用它,就可以向其添加
special
标记

更新
我在备用名称中添加了
displayedContext.ShapeMetadata.Type
,以便可以覆盖特定的形状(如列表项目页面)

如果有多个标记,该怎么办?每个标签一个备用?你有没有检查过其他类中添加替换的代码?@BertrandLeRoy我将为每个标记ATM使用一个替换。