我的内容MyContainer
附加了Container
部分。
然后我有几个MyContainerItem
内容附加了Containable
部分,并将这些内容分配给MyContainer
。
现在,如果内容MyContainer
已呈现,则内部使用List形状,因此每个MyContainerItem
内容都使用Summary
显示类型呈现,这似乎在Orchard中是硬编码的
有没有办法在不改变核心代码的情况下将MyContainerItem
的显示类型更改为Detail
?
我在替代品中尝试了变形技术,但无济于事。
答案 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