Roughing in Containers module

Container/containable editor templates appear
Container id settable via drop list
ContainerPathConstraint of higher priority providing list view

--HG--
branch : dev
This commit is contained in:
Louis DeJardin
2010-11-08 17:44:43 -08:00
parent ecdb058802
commit 5673576425
13 changed files with 216 additions and 11 deletions

View File

@@ -1,11 +1,57 @@
using System.Web.Mvc;
using System;
using System.Linq;
using System.Web.Mvc;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Aspects;
using Orchard.Core.Common.Models;
using Orchard.Core.Routable.Models;
using Orchard.DisplayManagement;
using Orchard.Themes;
namespace Orchard.Core.Containers.Controllers {
public class ItemController: Controller {
public class ItemController : Controller {
private readonly IContentManager _contentManager;
private readonly IContainersPathConstraint _containersPathConstraint;
public ItemController(IContentManager contentManager, IContainersPathConstraint containersPathConstraint, IShapeFactory shapeFactory) {
_contentManager = contentManager;
_containersPathConstraint = containersPathConstraint;
New = shapeFactory;
}
dynamic New { get; set; }
[Themed]
public ActionResult Display(string path, int? page) {
return View();
public ActionResult Display(string path, int? page) {
var matchedPath = _containersPathConstraint.FindPath(path);
if (string.IsNullOrEmpty(matchedPath)) {
throw new ApplicationException("404 - should not have passed path constraint");
}
var hits = _contentManager
.Query<RoutePart, RoutePartRecord>(VersionOptions.Published)
.Where(r => r.Path == matchedPath)
.Slice(0, 2);
if (hits.Count() == 0) {
throw new ApplicationException("404 - should not have passed path constraint");
}
if (hits.Count() != 1) {
throw new ApplicationException("Ambiguous content");
}
var containerId = hits.Single().Id;
var items = _contentManager
.Query<ContentPart<CommonPartRecord>, CommonPartRecord>(VersionOptions.Published)
.Where(x => x.Container.Id == containerId)
.List();
var itemDisplays = items.Select(item => _contentManager.BuildDisplay(item, "Summary"));
var list = New.List();
list.AddRange(itemDisplays);
return View(list);
}
}
}

View File

@@ -1,7 +1,60 @@
using Orchard.ContentManagement.Drivers;
using System;
using System.Linq;
using System.Web.Mvc;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Aspects;
using Orchard.ContentManagement.Drivers;
using Orchard.Core.Containers.Models;
using Orchard.Core.Containers.ViewModels;
using Orchard.Localization;
namespace Orchard.Core.Containers.Drivers {
public class ContainablePartDriver : ContentPartDriver<ContainablePart> {
private readonly IContentManager _contentManager;
public ContainablePartDriver(IContentManager contentManager) {
_contentManager = contentManager;
T = NullLocalizer.Instance;
}
public Localizer T { get; set; }
protected override DriverResult Editor(ContainablePart part, dynamic shapeHelper) {
return Editor(part, null, shapeHelper);
}
protected override DriverResult Editor(ContainablePart part, IUpdateModel updater, dynamic shapeHelper) {
return ContentShape(
"Parts_Containable_Edit",
() => {
var commonPart = part.As<ICommonPart>();
var model = new ContainableViewModel();
if (commonPart.Container != null) {
model.ContainerId = commonPart.Container.Id;
}
if (updater != null) {
var oldContainerId = model.ContainerId;
updater.TryUpdateModel(model, "Containable", null, null);
if (oldContainerId != model.ContainerId) {
commonPart.Container = _contentManager.Get(model.ContainerId, VersionOptions.Latest);
}
}
var containers = _contentManager.Query<ContainerPart, ContainerPartRecord>(VersionOptions.Latest).List();
var listItems = new[] { new SelectListItem { Text = T("(None)").Text, Value = "0" } }
.Concat(containers.Select(x => new SelectListItem {
Value = Convert.ToString(x.Id),
Text = x.ContentItem.TypeDefinition.DisplayName + ": " + x.As<IRoutableAspect>().Title,
Selected = x.Id == model.ContainerId,
}))
.ToList();
model.AvailableContainers = new SelectList(listItems, "Value", "Text", model.ContainerId);
return shapeHelper.EditorTemplate(TemplateName: "Containable", Model: model, Prefix: "Containable");
});
}
}
}
}

View File

@@ -1,7 +1,28 @@
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers;
using Orchard.Core.Containers.Models;
using Orchard.Data;
namespace Orchard.Core.Containers.Drivers {
public class ContainerPartDriver : ContentPartDriver<ContainerPart>{
public class ContainerPartDriver : ContentPartDriver<ContainerPart> {
protected override DriverResult Editor(ContainerPart part, dynamic shapeHelper) {
return Editor(part, null, shapeHelper);
}
protected override DriverResult Editor(ContainerPart part, ContentManagement.IUpdateModel updater, dynamic shapeHelper) {
return ContentShape(
"Parts_Container_Edit",
() => {
if (updater != null)
updater.TryUpdateModel(part, "Container", null, null);
return shapeHelper.EditorTemplate(TemplateName: "Container", Model: part, Prefix: "Container");
});
}
}
}
public class ContainerPartHandler : ContentHandler {
public ContainerPartHandler(IRepository<ContainerPartRecord> repository) {
Filters.Add(StorageFilter.For(repository));
}
}
}

View File

@@ -6,10 +6,10 @@ namespace Orchard.Core.Containers.Models {
}
public class ContainerPartRecord : ContentPartRecord {
public virtual bool Paginated { get; set; }
public virtual int Paginated { get; set; }
public virtual int PageSize { get; set; }
public virtual string OrderByProperty { get; set; }
public virtual OrderByDirection OrderByDirection { get; set; }
public virtual int OrderByDirection { get; set; }
}
public enum OrderByDirection {

View File

@@ -8,5 +8,5 @@ Description: The common module introduces container and containable behaviors fo
Features:
Containers:
Description: Container content parts.
Dependencies: Settings
Dependencies: Contents, Routable
Category: Content

View File

@@ -0,0 +1,4 @@
<Placement>
<Place Parts_Containable_Edit="Content:before.3"/>
<Place Parts_Container_Edit="Content:5"/>
</Placement>

View File

@@ -0,0 +1,34 @@
using System.Linq;
using Orchard.ContentManagement;
using Orchard.Core.Containers.Models;
using Orchard.Core.Routable.Models;
using Orchard.Environment;
using Orchard.Tasks;
namespace Orchard.Core.Containers.Services {
public class ContainersPathConstraintUpdater : IOrchardShellEvents, IBackgroundTask {
private readonly IContainersPathConstraint _containersPathConstraint;
private readonly IContentManager _contentManager;
public ContainersPathConstraintUpdater(IContainersPathConstraint containersPathConstraint, IContentManager contentManager) {
_containersPathConstraint = containersPathConstraint;
_contentManager = contentManager;
}
void IOrchardShellEvents.Activated() {
Refresh();
}
void IOrchardShellEvents.Terminating() {
}
void IBackgroundTask.Sweep() {
Refresh();
}
private void Refresh() {
var routeParts = _contentManager.Query<RoutePart, RoutePartRecord>().Join<ContainerPartRecord>().List();
_containersPathConstraint.SetPaths(routeParts.Select(x=>x.Path));
}
}
}

View File

@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
namespace Orchard.Core.Containers.ViewModels {
public class ContainableViewModel {
public int ContainerId { get; set; }
public SelectList AvailableContainers { get; set; }
}
}

View File

@@ -0,0 +1,6 @@
@model Orchard.Core.Containers.ViewModels.ContainableViewModel
<fieldset>
@Html.LabelFor(m => m.ContainerId, T("Add to"))
@Html.DropDownListFor(m => m.ContainerId, Model.AvailableContainers)
</fieldset>

View File

@@ -0,0 +1,21 @@
@model Orchard.Core.Containers.Models.ContainerPart
<fieldset>
@Html.LabelFor(m => m.Record.Paginated, T("Paginated"))
@Html.TextBoxFor(m => m.Record.Paginated)
</fieldset>
<fieldset>
@Html.LabelFor(m => m.Record.PageSize, T("PageSize"))
@Html.TextBoxFor(m => m.Record.PageSize)
</fieldset>
<fieldset>
@Html.LabelFor(m => m.Record.OrderByProperty, T("OrderByProperty"))
@Html.TextBoxFor(m => m.Record.OrderByProperty)
</fieldset>
<fieldset>
@Html.LabelFor(m => m.Record.OrderByDirection, T("OrderByDirection"))
@Html.TextBoxFor(m => m.Record.OrderByDirection)
</fieldset>

View File

@@ -0,0 +1 @@
@Display(Model)

View File

@@ -80,6 +80,8 @@
<Compile Include="Common\Shapes.cs" />
<Compile Include="Common\Fields\TextField.cs" />
<Compile Include="Containers\Routes.cs" />
<Compile Include="Containers\Services\ContainersPathConstraintUpdater.cs" />
<Compile Include="Containers\ViewModels\ContainableViewModel.cs" />
<Compile Include="Contents\Security\AuthorizationEventHandler.cs" />
<Compile Include="Common\Services\BbcodeFilter.cs" />
<Compile Include="Common\Services\ICommonService.cs" />
@@ -387,6 +389,10 @@
<Content Include="Settings\Styles\Web.config">
<SubType>Designer</SubType>
</Content>
<Content Include="Containers\Placement.info" />
<Content Include="Containers\Views\EditorTemplates\Containable.cshtml" />
<Content Include="Containers\Views\EditorTemplates\Container.cshtml" />
<Content Include="Containers\Views\Item\Display.cshtml" />
</ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

View File

@@ -14,6 +14,7 @@ namespace Orchard.Lists {
.WithPart("CommonPart")
.WithPart("RoutePart")
.WithPart("ContainerPart")
.WithPart("MenuPart")
.Creatable());
//ContentDefinitionManager.AlterTypeDefinition("ListWidget",