mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-09-22 20:13:50 +08:00
#17312: Refactoring ContainerPart to use a driver
Work Item: 17312 --HG-- branch : 1.x
This commit is contained in:
@@ -59,34 +59,8 @@ namespace Orchard.Core.Containers.Controllers {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var container = _contentManager.Get(hits.Single().Id);
|
var container = _contentManager.Get(hits.Single().Id);
|
||||||
IContentQuery<ContentItem> query = _contentManager
|
container.As<ContainerPart>().PagerParameters = pagerParameters;
|
||||||
.Query(VersionOptions.Published)
|
|
||||||
.Join<CommonPartRecord>().Where(cr => cr.Container.Id == container.Id);
|
|
||||||
|
|
||||||
var descendingOrder = container.As<ContainerPart>().Record.OrderByDirection == (int) OrderByDirection.Descending;
|
|
||||||
query = query.OrderBy(container.As<ContainerPart>().Record.OrderByProperty, descendingOrder);
|
|
||||||
|
|
||||||
_feedManager.Register(container.As<RoutePart>().Title, "rss", new RouteValueDictionary { { "containerid", container.Id } });
|
|
||||||
|
|
||||||
Pager pager = new Pager(_siteService.GetSiteSettings(), pagerParameters);
|
|
||||||
pager.PageSize = pagerParameters.PageSize != null && container.As<ContainerPart>().Record.Paginated
|
|
||||||
? pager.PageSize
|
|
||||||
: container.As<ContainerPart>().Record.PageSize;
|
|
||||||
var pagerShape = Shape.Pager(pager).TotalItemCount(query.Count());
|
|
||||||
|
|
||||||
var startIndex = container.As<ContainerPart>().Record.Paginated ? pager.GetStartIndex() : 0;
|
|
||||||
var pageOfItems = query.Slice(startIndex, pager.PageSize).ToList();
|
|
||||||
|
|
||||||
var list = Shape.List();
|
|
||||||
list.AddRange(pageOfItems.Select(item => _contentManager.BuildDisplay(item, "Summary")));
|
|
||||||
list.Classes.Add("content-items");
|
|
||||||
list.Classes.Add("list-items");
|
|
||||||
|
|
||||||
var model = _contentManager.BuildDisplay(container, "Detail");
|
var model = _contentManager.BuildDisplay(container, "Detail");
|
||||||
model.Content.Add(list, "7");
|
|
||||||
if (container.As<ContainerPart>().Record.Paginated) {
|
|
||||||
model.Content.Add(pagerShape, "7.5");
|
|
||||||
}
|
|
||||||
|
|
||||||
return new ShapeResult(this, model);
|
return new ShapeResult(this, model);
|
||||||
}
|
}
|
||||||
|
@@ -2,7 +2,6 @@
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Web.Mvc;
|
using System.Web.Mvc;
|
||||||
using Orchard.ContentManagement;
|
using Orchard.ContentManagement;
|
||||||
using Orchard.ContentManagement.Aspects;
|
|
||||||
using Orchard.ContentManagement.Drivers;
|
using Orchard.ContentManagement.Drivers;
|
||||||
using Orchard.Core.Common.Models;
|
using Orchard.Core.Common.Models;
|
||||||
using Orchard.Core.Containers.Models;
|
using Orchard.Core.Containers.Models;
|
||||||
@@ -44,6 +43,7 @@ namespace Orchard.Core.Containers.Drivers {
|
|||||||
commonPart.Record.Container = containerItem == null ? null : containerItem.Record;
|
commonPart.Record.Container = containerItem == null ? null : containerItem.Record;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
part.Weight = model.Weight;
|
||||||
}
|
}
|
||||||
|
|
||||||
// note: string.isnullorempty not being recognized by linq-to-nhibernate hence the inline or
|
// note: string.isnullorempty not being recognized by linq-to-nhibernate hence the inline or
|
||||||
@@ -59,6 +59,7 @@ namespace Orchard.Core.Containers.Drivers {
|
|||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
model.AvailableContainers = new SelectList(listItems, "Value", "Text", model.ContainerId);
|
model.AvailableContainers = new SelectList(listItems, "Value", "Text", model.ContainerId);
|
||||||
|
model.Weight = part.Weight;
|
||||||
|
|
||||||
return shapeHelper.EditorTemplate(TemplateName: "Containable", Model: model, Prefix: "Containable");
|
return shapeHelper.EditorTemplate(TemplateName: "Containable", Model: model, Prefix: "Containable");
|
||||||
});
|
});
|
||||||
|
@@ -7,29 +7,79 @@ using Orchard.ContentManagement.Handlers;
|
|||||||
using Orchard.ContentManagement.MetaData;
|
using Orchard.ContentManagement.MetaData;
|
||||||
using Orchard.Core.Common.Models;
|
using Orchard.Core.Common.Models;
|
||||||
using Orchard.Core.Containers.Models;
|
using Orchard.Core.Containers.Models;
|
||||||
using Orchard.Core.Containers.Settings;
|
|
||||||
using Orchard.Core.Containers.ViewModels;
|
using Orchard.Core.Containers.ViewModels;
|
||||||
using Orchard.Data;
|
|
||||||
using Orchard.Localization;
|
using Orchard.Localization;
|
||||||
using Orchard.UI.Notify;
|
using Orchard.UI.Notify;
|
||||||
|
using Orchard.DisplayManagement;
|
||||||
|
using Orchard.Core.Containers.Extensions;
|
||||||
|
using Orchard.Core.Routable.Models;
|
||||||
|
using System.Web.Routing;
|
||||||
|
using Orchard.Settings;
|
||||||
|
using Orchard.Core.Feeds;
|
||||||
|
using Orchard.UI.Navigation;
|
||||||
|
|
||||||
namespace Orchard.Core.Containers.Drivers {
|
namespace Orchard.Core.Containers.Drivers {
|
||||||
public class ContainerPartDriver : ContentPartDriver<ContainerPart> {
|
public class ContainerPartDriver : ContentPartDriver<ContainerPart> {
|
||||||
private readonly IContentDefinitionManager _contentDefinitionManager;
|
private readonly IContentDefinitionManager _contentDefinitionManager;
|
||||||
|
private readonly IOrchardServices _orchardServices;
|
||||||
|
private readonly IContentManager _contentManager;
|
||||||
|
private readonly dynamic _shapeFactory;
|
||||||
|
private readonly ISiteService _siteService;
|
||||||
|
private readonly IFeedManager _feedManager;
|
||||||
|
|
||||||
public ContainerPartDriver(IContentDefinitionManager contentDefinitionManager, IOrchardServices orchardServices) {
|
public ContainerPartDriver(
|
||||||
|
IContentDefinitionManager contentDefinitionManager,
|
||||||
|
IOrchardServices orchardServices,
|
||||||
|
IShapeFactory shapeFactory,
|
||||||
|
ISiteService siteService,
|
||||||
|
IFeedManager feedManager) {
|
||||||
_contentDefinitionManager = contentDefinitionManager;
|
_contentDefinitionManager = contentDefinitionManager;
|
||||||
Services = orchardServices;
|
_orchardServices = orchardServices;
|
||||||
|
_contentManager = orchardServices.ContentManager;
|
||||||
|
_shapeFactory = shapeFactory;
|
||||||
|
_siteService = siteService;
|
||||||
|
_feedManager = feedManager;
|
||||||
|
|
||||||
T = NullLocalizer.Instance;
|
T = NullLocalizer.Instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public IOrchardServices Services { get; private set; }
|
|
||||||
public Localizer T { get; set; }
|
public Localizer T { get; set; }
|
||||||
|
|
||||||
protected override DriverResult Display(ContainerPart part, string displayType, dynamic shapeHelper) {
|
protected override DriverResult Display(ContainerPart part, string displayType, dynamic shapeHelper) {
|
||||||
|
if (!part.ItemsShown)
|
||||||
|
return null;
|
||||||
|
|
||||||
return Combined(
|
return Combined(
|
||||||
ContentShape("Parts_Container_Contained",
|
ContentShape("Parts_Container_Contained",
|
||||||
() => shapeHelper.Parts_Container_Contained(ContentPart: part)),
|
() => {
|
||||||
|
var container = part.ContentItem;
|
||||||
|
|
||||||
|
IContentQuery<ContentItem> query = _contentManager
|
||||||
|
.Query(VersionOptions.Published)
|
||||||
|
.Join<CommonPartRecord>().Where(cr => cr.Container.Id == container.Id);
|
||||||
|
|
||||||
|
var descendingOrder = part.OrderByDirection == (int)OrderByDirection.Descending;
|
||||||
|
query = query.OrderBy(part.OrderByProperty, descendingOrder);
|
||||||
|
|
||||||
|
_feedManager.Register(container.As<RoutePart>().Title, "rss", new RouteValueDictionary { { "containerid", container.Id } });
|
||||||
|
|
||||||
|
var pager = new Pager(_siteService.GetSiteSettings(), part.PagerParameters);
|
||||||
|
pager.PageSize = part.PagerParameters.PageSize != null && part.Paginated
|
||||||
|
? pager.PageSize
|
||||||
|
: part.PageSize;
|
||||||
|
|
||||||
|
// var pagerShape = _shapeFactory.Pager(pager).TotalItemCount(query.Count());
|
||||||
|
|
||||||
|
var startIndex = part.Paginated ? pager.GetStartIndex() : 0;
|
||||||
|
var pageOfItems = query.Slice(startIndex, pager.PageSize).ToList();
|
||||||
|
|
||||||
|
var list = _shapeFactory.List();
|
||||||
|
list.AddRange(pageOfItems.Select(item => _contentManager.BuildDisplay(item, "Summary")));
|
||||||
|
list.Classes.Add("content-items");
|
||||||
|
list.Classes.Add("list-items");
|
||||||
|
|
||||||
|
return list;
|
||||||
|
}),
|
||||||
ContentShape("Parts_Container_Contained_Summary",
|
ContentShape("Parts_Container_Contained_Summary",
|
||||||
() => shapeHelper.Parts_Container_Contained_Summary(ContentPart: part)),
|
() => shapeHelper.Parts_Container_Contained_Summary(ContentPart: part)),
|
||||||
ContentShape("Parts_Container_Contained_SummaryAdmin",
|
ContentShape("Parts_Container_Contained_SummaryAdmin",
|
||||||
@@ -39,9 +89,8 @@ namespace Orchard.Core.Containers.Drivers {
|
|||||||
|
|
||||||
protected override DriverResult Editor(ContainerPart part, dynamic shapeHelper) {
|
protected override DriverResult Editor(ContainerPart part, dynamic shapeHelper) {
|
||||||
// if there are no containable items then show a nice little warning
|
// if there are no containable items then show a nice little warning
|
||||||
if (!_contentDefinitionManager.ListTypeDefinitions()
|
if (!_contentDefinitionManager.ListTypeDefinitions().Any(typeDefinition => typeDefinition.Parts.Any(partDefinition => partDefinition.PartDefinition.Name == "ContainablePart"))) {
|
||||||
.Where(typeDefinition => typeDefinition.Parts.Any(partDefinition => partDefinition.PartDefinition.Name == "ContainablePart")).Any()) {
|
_orchardServices.Notifier.Warning(T("There are no content types in the system with a Containable part attached. Consider adding a Containable part to some content type, existing or new, in order to relate items to this (Container enabled) item."));
|
||||||
Services.Notifier.Warning(T("There are no content types in the system with a Containable part attached. Consider adding a Containable part to some content type, existing or new, in order to relate items to this (Container enabled) item."));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Editor(part, (IUpdateModel)null, shapeHelper);
|
return Editor(part, (IUpdateModel)null, shapeHelper);
|
||||||
@@ -62,7 +111,7 @@ namespace Orchard.Core.Containers.Drivers {
|
|||||||
}))
|
}))
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
model.AvailableContainables = new SelectList(listItems, "Value", "Text", model.Part.Record.ItemContentType);
|
model.AvailableContainables = new SelectList(listItems, "Value", "Text", model.Part.ItemContentType);
|
||||||
|
|
||||||
if (updater != null) {
|
if (updater != null) {
|
||||||
updater.TryUpdateModel(model, "Container", null, null);
|
updater.TryUpdateModel(model, "Container", null, null);
|
||||||
@@ -80,6 +129,11 @@ namespace Orchard.Core.Containers.Drivers {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var itemsShown = context.Attribute(part.PartDefinition.Name, "ItemsShown");
|
||||||
|
if (itemsShown != null) {
|
||||||
|
part.Record.ItemsShown = Convert.ToBoolean(itemsShown);
|
||||||
|
}
|
||||||
|
|
||||||
var paginated = context.Attribute(part.PartDefinition.Name, "Paginated");
|
var paginated = context.Attribute(part.PartDefinition.Name, "Paginated");
|
||||||
if (paginated != null) {
|
if (paginated != null) {
|
||||||
part.Record.Paginated = Convert.ToBoolean(paginated);
|
part.Record.Paginated = Convert.ToBoolean(paginated);
|
||||||
@@ -103,26 +157,11 @@ namespace Orchard.Core.Containers.Drivers {
|
|||||||
|
|
||||||
protected override void Exporting(ContainerPart part, ExportContentContext context) {
|
protected override void Exporting(ContainerPart part, ExportContentContext context) {
|
||||||
context.Element(part.PartDefinition.Name).SetAttributeValue("ItemContentType", part.Record.ItemContentType);
|
context.Element(part.PartDefinition.Name).SetAttributeValue("ItemContentType", part.Record.ItemContentType);
|
||||||
|
context.Element(part.PartDefinition.Name).SetAttributeValue("ItemsShown", part.Record.ItemsShown);
|
||||||
context.Element(part.PartDefinition.Name).SetAttributeValue("Paginated", part.Record.Paginated);
|
context.Element(part.PartDefinition.Name).SetAttributeValue("Paginated", part.Record.Paginated);
|
||||||
context.Element(part.PartDefinition.Name).SetAttributeValue("PageSize", part.Record.PageSize);
|
context.Element(part.PartDefinition.Name).SetAttributeValue("PageSize", part.Record.PageSize);
|
||||||
context.Element(part.PartDefinition.Name).SetAttributeValue("OrderByProperty", part.Record.OrderByProperty);
|
context.Element(part.PartDefinition.Name).SetAttributeValue("OrderByProperty", part.Record.OrderByProperty);
|
||||||
context.Element(part.PartDefinition.Name).SetAttributeValue("OrderByDirection", part.Record.OrderByDirection);
|
context.Element(part.PartDefinition.Name).SetAttributeValue("OrderByDirection", part.Record.OrderByDirection);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ContainerPartHandler : ContentHandler {
|
|
||||||
public ContainerPartHandler(IRepository<ContainerPartRecord> repository) {
|
|
||||||
Filters.Add(StorageFilter.For(repository));
|
|
||||||
OnInitializing<ContainerPart>((context, part) => {
|
|
||||||
part.Record.PageSize = part.Settings.GetModel<ContainerTypePartSettings>().PageSizeDefault
|
|
||||||
?? part.PartDefinition.Settings.GetModel<ContainerPartSettings>().PageSizeDefault;
|
|
||||||
part.Record.Paginated = part.Settings.GetModel<ContainerTypePartSettings>().PaginatedDefault
|
|
||||||
?? part.PartDefinition.Settings.GetModel<ContainerPartSettings>().PaginatedDefault;
|
|
||||||
|
|
||||||
// hard-coded defaults for ordering
|
|
||||||
part.Record.OrderByProperty = part.Is<CommonPart>() ? "CommonPart.CreatedUtc" : string.Empty;
|
|
||||||
part.Record.OrderByDirection = (int)OrderByDirection.Descending;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@@ -6,12 +6,16 @@ using Orchard.Core.Containers.Models;
|
|||||||
using Orchard.Core.Routable.Models;
|
using Orchard.Core.Routable.Models;
|
||||||
using Orchard.Core.Title.Models;
|
using Orchard.Core.Title.Models;
|
||||||
|
|
||||||
namespace Orchard.Core.Containers.Extensions
|
namespace Orchard.Core.Containers.Extensions {
|
||||||
{
|
|
||||||
public static class ContentQueryExtensions {
|
public static class ContentQueryExtensions {
|
||||||
public static IContentQuery<T> OrderBy<T>(this IContentQuery<T> query, string partAndProperty, bool descendingOrder) where T : IContent {
|
public static IContentQuery<T> OrderBy<T>(this IContentQuery<T> query, string partAndProperty, bool descendingOrder) where T : IContent {
|
||||||
//todo: (heskew) order by custom part properties
|
//todo: (heskew) order by custom part properties
|
||||||
switch (partAndProperty) {
|
switch (partAndProperty) {
|
||||||
|
case "ContainablePart.Weight":
|
||||||
|
query = descendingOrder
|
||||||
|
? query.OrderByDescending<ContainablePartRecord, int>(record => record.Weight)
|
||||||
|
: query.OrderBy<ContainablePartRecord, int>(record => record.Weight);
|
||||||
|
break;
|
||||||
case "TitlePart.Title":
|
case "TitlePart.Title":
|
||||||
query = descendingOrder
|
query = descendingOrder
|
||||||
? query.OrderByDescending<TitlePartRecord, string>(record => record.Title)
|
? query.OrderByDescending<TitlePartRecord, string>(record => record.Title)
|
||||||
|
@@ -0,0 +1,15 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Web;
|
||||||
|
using Orchard.ContentManagement.Handlers;
|
||||||
|
using Orchard.Data;
|
||||||
|
using Orchard.Core.Containers.Models;
|
||||||
|
|
||||||
|
namespace Orchard.Core.Containers.Handlers {
|
||||||
|
public class ContainablePartHandler : ContentHandler {
|
||||||
|
public ContainablePartHandler(IRepository<ContainablePartRecord> repository) {
|
||||||
|
Filters.Add(StorageFilter.For(repository));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,30 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Web;
|
||||||
|
using Orchard.ContentManagement.Handlers;
|
||||||
|
using Orchard.Core.Containers.Models;
|
||||||
|
using Orchard.Core.Containers.Settings;
|
||||||
|
using Orchard.Core.Common.Models;
|
||||||
|
using Orchard.Data;
|
||||||
|
using Orchard.Core.Containers.Extensions;
|
||||||
|
using Orchard.ContentManagement;
|
||||||
|
|
||||||
|
namespace Orchard.Core.Containers.Handlers {
|
||||||
|
public class ContainerPartHandler : ContentHandler {
|
||||||
|
public ContainerPartHandler(IRepository<ContainerPartRecord> repository) {
|
||||||
|
Filters.Add(StorageFilter.For(repository));
|
||||||
|
OnInitializing<ContainerPart>((context, part) => {
|
||||||
|
part.Record.ItemsShown = true;
|
||||||
|
part.Record.PageSize = part.Settings.GetModel<ContainerTypePartSettings>().PageSizeDefault
|
||||||
|
?? part.PartDefinition.Settings.GetModel<ContainerPartSettings>().PageSizeDefault;
|
||||||
|
part.Record.Paginated = part.Settings.GetModel<ContainerTypePartSettings>().PaginatedDefault
|
||||||
|
?? part.PartDefinition.Settings.GetModel<ContainerPartSettings>().PaginatedDefault;
|
||||||
|
|
||||||
|
// hard-coded defaults for ordering
|
||||||
|
part.Record.OrderByProperty = part.Is<CommonPart>() ? "CommonPart.CreatedUtc" : string.Empty;
|
||||||
|
part.Record.OrderByDirection = (int)OrderByDirection.Descending;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@@ -11,7 +11,9 @@ namespace Orchard.Core.Containers {
|
|||||||
.Column<bool>("Paginated")
|
.Column<bool>("Paginated")
|
||||||
.Column<int>("PageSize")
|
.Column<int>("PageSize")
|
||||||
.Column<string>("OrderByProperty")
|
.Column<string>("OrderByProperty")
|
||||||
.Column<int>("OrderByDirection"));
|
.Column<int>("OrderByDirection")
|
||||||
|
.Column<string>("ItemContentType")
|
||||||
|
.Column<bool>("ItemsShown", column => column.WithDefault(true)));
|
||||||
|
|
||||||
SchemaBuilder.CreateTable("ContainerWidgetPartRecord",
|
SchemaBuilder.CreateTable("ContainerWidgetPartRecord",
|
||||||
table => table
|
table => table
|
||||||
@@ -32,6 +34,11 @@ namespace Orchard.Core.Containers {
|
|||||||
.Column<string>("CustomTwo")
|
.Column<string>("CustomTwo")
|
||||||
.Column<string>("CustomThree"));
|
.Column<string>("CustomThree"));
|
||||||
|
|
||||||
|
SchemaBuilder.CreateTable("ContainablePartRecord",
|
||||||
|
table => table
|
||||||
|
.ContentPartRecord()
|
||||||
|
.Column<int>("Weight"));
|
||||||
|
|
||||||
ContentDefinitionManager.AlterTypeDefinition("ContainerWidget",
|
ContentDefinitionManager.AlterTypeDefinition("ContainerWidget",
|
||||||
cfg => cfg
|
cfg => cfg
|
||||||
.WithPart("CommonPart")
|
.WithPart("CommonPart")
|
||||||
@@ -43,12 +50,24 @@ namespace Orchard.Core.Containers {
|
|||||||
ContentDefinitionManager.AlterPartDefinition("ContainablePart", builder => builder.Attachable());
|
ContentDefinitionManager.AlterPartDefinition("ContainablePart", builder => builder.Attachable());
|
||||||
ContentDefinitionManager.AlterPartDefinition("CustomPropertiesPart", builder => builder.Attachable());
|
ContentDefinitionManager.AlterPartDefinition("CustomPropertiesPart", builder => builder.Attachable());
|
||||||
|
|
||||||
return 1;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int UpdateFrom1() {
|
public int UpdateFrom1() {
|
||||||
SchemaBuilder.AlterTable("ContainerPartRecord", table => table.AddColumn<string>("ItemContentType"));
|
SchemaBuilder.AlterTable("ContainerPartRecord", table => table.AddColumn<string>("ItemContentType"));
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int UpdateFrom2() {
|
||||||
|
SchemaBuilder.AlterTable("ContainerPartRecord",
|
||||||
|
table => table.AddColumn<bool>("ItemsShown", column => column.WithDefault(true)));
|
||||||
|
|
||||||
|
SchemaBuilder.CreateTable("ContainablePartRecord",
|
||||||
|
table => table
|
||||||
|
.ContentPartRecord()
|
||||||
|
.Column<int>("Weight"));
|
||||||
|
|
||||||
|
return 3;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,6 +1,15 @@
|
|||||||
using Orchard.ContentManagement;
|
using Orchard.ContentManagement;
|
||||||
|
using Orchard.ContentManagement.Records;
|
||||||
|
|
||||||
namespace Orchard.Core.Containers.Models {
|
namespace Orchard.Core.Containers.Models {
|
||||||
public class ContainablePart : ContentPart {
|
public class ContainablePart : ContentPart<ContainablePartRecord> {
|
||||||
|
public int Weight {
|
||||||
|
get { return Record.Weight; }
|
||||||
|
set { Record.Weight = value; }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class ContainablePartRecord : ContentPartRecord {
|
||||||
|
public virtual int Weight { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,12 +1,49 @@
|
|||||||
using Orchard.ContentManagement;
|
using Orchard.ContentManagement;
|
||||||
using Orchard.ContentManagement.Records;
|
using Orchard.ContentManagement.Records;
|
||||||
|
using Orchard.UI.Navigation;
|
||||||
|
|
||||||
namespace Orchard.Core.Containers.Models {
|
namespace Orchard.Core.Containers.Models {
|
||||||
public class ContainerPart : ContentPart<ContainerPartRecord> {
|
public class ContainerPart : ContentPart<ContainerPartRecord> {
|
||||||
|
public string ItemContentType {
|
||||||
|
get { return Record.ItemContentType; }
|
||||||
|
set { Record.ItemContentType = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool ItemsShown {
|
||||||
|
get { return Record.ItemsShown; }
|
||||||
|
set { Record.ItemsShown = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool Paginated {
|
||||||
|
get { return Record.Paginated; }
|
||||||
|
set { Record.Paginated = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public int PageSize {
|
||||||
|
get { return Record.PageSize; }
|
||||||
|
set { Record.PageSize = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public string OrderByProperty {
|
||||||
|
get { return Record.OrderByProperty; }
|
||||||
|
set { Record.OrderByProperty = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public int OrderByDirection {
|
||||||
|
get { return Record.OrderByDirection; }
|
||||||
|
set { Record.OrderByDirection = value; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public PagerParameters PagerParameters { get; set; }
|
||||||
|
|
||||||
|
public ContainerPart() {
|
||||||
|
PagerParameters = new PagerParameters();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public class ContainerPartRecord : ContentPartRecord {
|
public class ContainerPartRecord : ContentPartRecord {
|
||||||
public virtual string ItemContentType { get; set; }
|
public virtual string ItemContentType { get; set; }
|
||||||
|
public virtual bool ItemsShown { get; set; }
|
||||||
public virtual bool Paginated { get; set; }
|
public virtual bool Paginated { get; set; }
|
||||||
public virtual int PageSize { get; set; }
|
public virtual int PageSize { get; set; }
|
||||||
public virtual string OrderByProperty { get; set; }
|
public virtual string OrderByProperty { get; set; }
|
||||||
|
@@ -4,6 +4,9 @@
|
|||||||
Parts_Container_Contained
|
Parts_Container_Contained
|
||||||
Parts_Container_Contained_Summary
|
Parts_Container_Contained_Summary
|
||||||
-->
|
-->
|
||||||
|
<Match DisplayType="Detail">
|
||||||
|
<Place Parts_Container_Contained="Content:7.5"/>
|
||||||
|
</Match>
|
||||||
<Place Parts_Containable_Edit="Content:before.3"/>
|
<Place Parts_Containable_Edit="Content:before.3"/>
|
||||||
<Place Parts_Container_Edit="Content:5"/>
|
<Place Parts_Container_Edit="Content:5"/>
|
||||||
<Place Parts_CustomProperties_Edit="Content:5"/>
|
<Place Parts_CustomProperties_Edit="Content:5"/>
|
||||||
|
@@ -4,5 +4,6 @@ namespace Orchard.Core.Containers.ViewModels {
|
|||||||
public class ContainableViewModel {
|
public class ContainableViewModel {
|
||||||
public int ContainerId { get; set; }
|
public int ContainerId { get; set; }
|
||||||
public SelectList AvailableContainers { get; set; }
|
public SelectList AvailableContainers { get; set; }
|
||||||
|
public int Weight { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -1,5 +1,11 @@
|
|||||||
@model Orchard.Core.Containers.ViewModels.ContainableViewModel
|
@model Orchard.Core.Containers.ViewModels.ContainableViewModel
|
||||||
<fieldset>
|
<fieldset>
|
||||||
|
<span>
|
||||||
@Html.LabelFor(m => m.ContainerId, T("Add to"))
|
@Html.LabelFor(m => m.ContainerId, T("Add to"))
|
||||||
@Html.DropDownListFor(m => m.ContainerId, Model.AvailableContainers)
|
@Html.DropDownListFor(m => m.ContainerId, Model.AvailableContainers)
|
||||||
|
</span>
|
||||||
|
<span>
|
||||||
|
@Html.LabelFor(m => m.Weight, T("Weight"))
|
||||||
|
@Html.TextBoxFor(m => m.Weight, new { @class = "text text-small" })
|
||||||
|
</span>
|
||||||
</fieldset>
|
</fieldset>
|
@@ -1,34 +1,41 @@
|
|||||||
@model Orchard.Core.Containers.ViewModels.ContainerViewModel
|
@model Orchard.Core.Containers.ViewModels.ContainerViewModel
|
||||||
@using Orchard.Core.Containers.Models;
|
@using Orchard.Core.Containers.Models;
|
||||||
|
<fieldset class="with-checkbox">
|
||||||
|
<span class="checkbox-and-label">
|
||||||
|
@Html.CheckBoxFor(m => m.Part.ItemsShown)
|
||||||
|
<label for="@Html.FieldIdFor(m => m.Part.ItemsShown)" class="forcheckbox">@T("Show contained items list")</label>
|
||||||
|
</span>
|
||||||
|
</fieldset>
|
||||||
<fieldset>
|
<fieldset>
|
||||||
@Html.LabelFor(m => m.Part.Record.ItemContentType, T("Contains"))
|
@Html.LabelFor(m => m.Part.ItemContentType, T("Contains"))
|
||||||
@Html.DropDownListFor(m => m.Part.Record.ItemContentType, Model.AvailableContainables)
|
@Html.DropDownListFor(m => m.Part.ItemContentType, Model.AvailableContainables)
|
||||||
<span class="hint">@T("Only types with the Containable part can be contained in a list.")</span>
|
<span class="hint">@T("Only types with the Containable part can be contained in a list.")</span>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<fieldset>
|
<fieldset>
|
||||||
@Html.LabelFor(m => m.Part.Record.OrderByProperty, T("Order by"))
|
@Html.LabelFor(m => m.Part.OrderByProperty, T("Order by"))
|
||||||
<select id="@Html.FieldIdFor(m => m.Part.Record.OrderByProperty)" name="@Html.FieldNameFor(m => m.Part.Record.OrderByProperty)">
|
<select id="@Html.FieldIdFor(m => m.Part.OrderByProperty)" name="@Html.FieldNameFor(m => m.Part.OrderByProperty)">
|
||||||
@Html.SelectOption(Model.Part.Record.OrderByProperty, "CommonPart.CreatedUtc", T("Date Created").Text)
|
@Html.SelectOption(Model.Part.OrderByProperty, "ContainablePart.Weight", T("Weight").Text)
|
||||||
@Html.SelectOption(Model.Part.Record.OrderByProperty, "CommonPart.PublishedUtc", T("Date Published").Text)
|
@Html.SelectOption(Model.Part.OrderByProperty, "CommonPart.CreatedUtc", T("Date Created").Text)
|
||||||
@Html.SelectOption(Model.Part.Record.OrderByProperty, "TitlePart.Title", T("Title").Text)
|
@Html.SelectOption(Model.Part.OrderByProperty, "CommonPart.PublishedUtc", T("Date Published").Text)
|
||||||
@Html.SelectOption(Model.Part.Record.OrderByProperty, "RoutePart.Title", T("Routable Title").Text)
|
@Html.SelectOption(Model.Part.OrderByProperty, "TitlePart.Title", T("Title").Text)
|
||||||
@Html.SelectOption(Model.Part.Record.OrderByProperty, "RoutePart.Slug", T("Slug").Text)
|
@Html.SelectOption(Model.Part.OrderByProperty, "RoutePart.Title", T("Routable Title").Text)
|
||||||
@Html.SelectOption(Model.Part.Record.OrderByProperty, "CustomPropertiesPart.CustomOne", T("Custom 1").Text)
|
@Html.SelectOption(Model.Part.OrderByProperty, "RoutePart.Slug", T("Slug").Text)
|
||||||
@Html.SelectOption(Model.Part.Record.OrderByProperty, "CustomPropertiesPart.CustomTwo", T("Custom 2").Text)
|
@Html.SelectOption(Model.Part.OrderByProperty, "CustomPropertiesPart.CustomOne", T("Custom 1").Text)
|
||||||
@Html.SelectOption(Model.Part.Record.OrderByProperty, "CustomPropertiesPart.CustomThree", T("Custom 3").Text)
|
@Html.SelectOption(Model.Part.OrderByProperty, "CustomPropertiesPart.CustomTwo", T("Custom 2").Text)
|
||||||
|
@Html.SelectOption(Model.Part.OrderByProperty, "CustomPropertiesPart.CustomThree", T("Custom 3").Text)
|
||||||
</select>
|
</select>
|
||||||
<select id="@Html.FieldIdFor(m => m.Part.Record.OrderByDirection)" name="@Html.FieldNameFor(m => m.Part.Record.OrderByDirection)">
|
<select id="@Html.FieldIdFor(m => m.Part.OrderByDirection)" name="@Html.FieldNameFor(m => m.Part.OrderByDirection)">
|
||||||
@Html.SelectOption(Model.Part.Record.OrderByDirection, (int)OrderByDirection.Ascending, T("Ascending").Text)
|
@Html.SelectOption(Model.Part.OrderByDirection, (int)OrderByDirection.Ascending, T("Ascending").Text)
|
||||||
@Html.SelectOption(Model.Part.Record.OrderByDirection, (int)OrderByDirection.Descending, T("Descending").Text)
|
@Html.SelectOption(Model.Part.OrderByDirection, (int)OrderByDirection.Descending, T("Descending").Text)
|
||||||
</select>
|
</select>
|
||||||
</fieldset>
|
</fieldset>
|
||||||
<fieldset class="with-checkbox">
|
<fieldset class="with-checkbox">
|
||||||
<span>
|
<span>
|
||||||
@Html.LabelFor(m => m.Part.Record.PageSize, T("Page size"))
|
@Html.LabelFor(m => m.Part.PageSize, T("Page size"))
|
||||||
@Html.TextBoxFor(m => m.Part.Record.PageSize, new { @class = "text text-small" })
|
@Html.TextBoxFor(m => m.Part.PageSize, new { @class = "text text-small" })
|
||||||
</span>
|
</span>
|
||||||
<span class="checkbox-and-label">
|
<span class="checkbox-and-label">
|
||||||
@Html.CheckBoxFor(m => m.Part.Record.Paginated)
|
@Html.CheckBoxFor(m => m.Part.Paginated)
|
||||||
<label for="@Html.FieldIdFor(m => m.Part.Record.Paginated)" class="forcheckbox">@T("Show paging controls")</label>
|
<label for="@Html.FieldIdFor(m => m.Part.Paginated)" class="forcheckbox">@T("Show paging controls")</label>
|
||||||
</span>
|
</span>
|
||||||
</fieldset>
|
</fieldset>
|
@@ -89,6 +89,8 @@
|
|||||||
<Compile Include="Containers\Drivers\ContainerWidgetPartDriver.cs" />
|
<Compile Include="Containers\Drivers\ContainerWidgetPartDriver.cs" />
|
||||||
<Compile Include="Containers\Drivers\CustomPropertiesDriver.cs" />
|
<Compile Include="Containers\Drivers\CustomPropertiesDriver.cs" />
|
||||||
<Compile Include="Containers\Extensions\ContentQueryExtensions.cs" />
|
<Compile Include="Containers\Extensions\ContentQueryExtensions.cs" />
|
||||||
|
<Compile Include="Containers\Handlers\ContainablePartHandler.cs" />
|
||||||
|
<Compile Include="Containers\Handlers\ContainerPartHandler.cs" />
|
||||||
<Compile Include="Containers\Migrations.cs" />
|
<Compile Include="Containers\Migrations.cs" />
|
||||||
<Compile Include="Containers\Models\ContainablePart.cs" />
|
<Compile Include="Containers\Models\ContainablePart.cs" />
|
||||||
<Compile Include="Containers\Models\ContainerPart.cs" />
|
<Compile Include="Containers\Models\ContainerPart.cs" />
|
||||||
|
Reference in New Issue
Block a user