如何在Orchard中更改List项目形状的DisplayType?

时间:2016-01-20 08:27:08

标签: orchardcms shapes

我的内容MyContainer附加了Container部分。

然后我有几个MyContainerItem内容附加了Containable部分,并将这些内容分配给MyContainer

现在,如果内容MyContainer已呈现,则内部使用List形状,因此每个MyContainerItem内容都使用Summary显示类型呈现,这似乎在Orchard中是硬编码的

有没有办法在不改变核心代码的情况下将MyContainerItem的显示类型更改为Detail

我在替代品中尝试了变形技术,但无济于事。

2 个答案:

答案 0 :(得分:1)

我之前在其他内容部分遇到过这个问题(不记得哪个),但你可以做的是采取以下步骤:

1创建自定义部件和记录以附加到具有ContainerPart的内容类型:

public CustomContainerPart : ContentPart<CustomContainerPartRecord> {
    public string DisplayType {
        // property setter and getter
    }
}

2创建一个处理程序,将CustomContainerPart附加到具有ContainerPart的内容类型上:

public class CustomContainerPartHandler : ContentHandler {
    private readonly IContentDefinitionManager _contentDefinitionManager;

    public CustomContainerPartHandler(IContentDefinitionManager contentDefinitionManager) {
        _contentDefinitionManager = contentDefinitionManager;
    }

    protected override void Activating(ActivatingContentContext context) {
        base.Activating(context);

        // weld the CustomContainerPart dynamically, if the type has the ContainerPart
        var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(context.ContentType);
        if (contentTypeDefinition == null) {
            return;
        }

        if (contentTypeDefinition.Parts.Any(part => part.PartDefinition.Name == typeof(ContainerPart).Name)) {
            context.Builder.Weld<CustomContainerPart>();
        }
    }
}

3为自定义零件创建驱动程序并使用此Display方法:

protected override DriverResult Display(CustomContainerPart part, string displayType, dynamic shapeHelper) {    
    return ContentShape("Parts_Container_CustomContained", () => {
        var containerPart = part.As<ContainerPart>();
        // copy code from Orchard.Core/Containers/Drivers/ContainerPartDriver.cs here and tweak it to use the CustomContainerPart display type property
        // ..
        var listShape = shapeHelper.List();
        listShape.AddRange(pageOfItems.Select(item => _contentManager.BuildDisplay(item, part.DisplayType))); // here use your custom part setting
        // ..
    });
}

4最后你的Placement.info:

<Place Parts_Container_Contained="-" />
<Match DisplayType="Detail">
  <Place Parts_Container_CustomContained="Content:7.5"/>
</Match>

答案 1 :(得分:0)

嗯,我正以错误的方式接近它。

在我看来,替代方案将是更好的解决方案,因为它不会改变列表行为。

现在我理解这种方式:列表通常应该显示每个项目的摘要,当我点击项目时显示详细信息,这是有道理的。

因此,不要更改DisplayType,而只是根据文档创建具有相应名称的备用项:

http://docs.orchardproject.net/Documentation/Accessing-and-rendering-shapes#NamingShapesandTemplates

在我的情况下,候补将是Content.Summary-MyContainerItem.cshtml,其中包含以下内容:

@Model.Content.Items[0].Html