Orchardcms 仅将包装器添加到特定区域中的小部件

Orchardcms 仅将包装器添加到特定区域中的小部件,orchardcms,Orchardcms,我正在placement.info中为小部件添加自定义包装,如下所示: <Match ContentType="Widget"> <Place Parts_Common_Body="Content:5;Wrapper=Wrapper_AsideWidget" /> </Match> 这很好,但我需要将自定义包装器的应用限制为仅在几个特定区域中的小部件。现在,它们被应用于所有区域的小部件。实现这一目标的最佳方式是什么?如果Match元素的作用域可以限

我正在placement.info中为小部件添加自定义包装,如下所示:

<Match ContentType="Widget">
   <Place Parts_Common_Body="Content:5;Wrapper=Wrapper_AsideWidget" />
</Match>

这很好,但我需要将自定义包装器的应用限制为仅在几个特定区域中的小部件。现在,它们被应用于所有区域的小部件。实现这一目标的最佳方式是什么?如果Match元素的作用域可以限定为一个区域,那将是完美的,但我认为这是不可能的

有什么建议吗

更新

这是我提出的最终解决方案。它将自定义包装应用于备用区域中的任何小部件。只是让学生进入主题

public class AsideWidgetShapeProvider : IShapeTableProvider
{
    public void Discover(ShapeTableBuilder builder)
    {
        builder.Describe("Widget")
            .OnDisplaying(displaying =>
            {
                var shape = displaying.Shape;
                ContentItem contentItem = shape.ContentItem;
                if (contentItem != null)
                {
                    var zoneName = contentItem.As<WidgetPart>().Zone;
                    if (zoneName == "AsideFirst" || zoneName == "AsideSecond")
                    {
                        shape.Metadata.Wrappers.Add("Wrapper_AsideWidget");
                    }
                }
            });
    }
}
公共类AsideWidgetShapeProvider:IShapeTableProvider
{
公共空间发现(ShapeTableBuilder)
{
builder.description(“小部件”)
.OnDisplay(显示=>
{
var shape=显示.shape;
ContentItem ContentItem=shape.ContentItem;
if(contentItem!=null)
{
var zoneName=contentItem.As().Zone;
如果(zoneName==“AsideFirst”| | zoneName==“AsideSecond”)
{
shape.Metadata.Wrappers.Add(“Wrapper_AsideWidget”);
}
}
});
}
}

您可以创建一个形状表提供程序,用于描述
零件\u公共\u主体
形状的行为,并有条件地应用包装器。只需向模块中添加一个类,如下面所示,Orchard将在构建形状表时对其进行处理

例如:

using Orchard.ContentManagement;
using Orchard.DisplayManagement.Descriptors;
using Orchard.Widgets.Models;

namespace MyModule {
    public class ShapeTable : IShapeTableProvider {
        public void Discover(ShapeTableBuilder builder) {
            builder.Describe("Parts_Common_Body")
                .OnDisplaying(ctx => {
                    var shape = ctx.Shape;
                    // Parts_Common_Body has a ContentPart property, so you can
                    // do this to get at the content item.
                    var contentItem = ((IContent)shape.ContentPart).ContentItem;
                    if (contentItem.ContentType == "Widget") { // content type to check for
                        var widgetPart = contentItem.As<WidgetPart>();
                        if (widgetPart.Zone == "AsideFirst") { // zone to check for
                            // Condition is met, let's add the wrapper.
                            ctx.ShapeMetadata.Wrappers.Add("Wrapper_AsideWidget");
                        }
                    }
                });
        }
    }
}
使用Orchard.ContentManagement;
使用Orchard.DisplayManagement.Descriptors;
使用Orchard.Widgets.Models;
名称空间MyModule{
公共类ShapeTable:IShapeTableProvider{
公共空间发现(ShapeTableBuilder){
建造商。描述(“零件\通用\车身”)
.OnDisplay(ctx=>{
var shape=ctx.shape;
//Parts\u Common\u Body具有ContentPart属性,因此您可以
//执行此操作以获取内容项。
var contentItem=((IContent)shape.ContentPart).contentItem;
如果(contentItem.ContentType==“小部件”){//要检查的内容类型
var widgetPart=contentItem.As();
如果(widgetPart.Zone==“AsideFirst”){//要检查的区域
//条件满足后,让我们添加包装器。
ctx.ShapeMetadata.Wrappers.Add(“Wrapper_AsideWidget”);
}
}
});
}
}
}

谢谢@Katsuyuki!这为我指明了正确的方向。我也觉得这很有帮助。我用我的最终答案更新了我的问题。