diff --git a/.hgsubstate b/.hgsubstate index a0575ff4a..f329ab186 100644 --- a/.hgsubstate +++ b/.hgsubstate @@ -1 +1 @@ -3bc513c8049ad19173130a0e0e6a5486ee8247d2 Clay +cf89a75f4158f045c90fb7e5ee1a766623abaa71 Clay diff --git a/src/Orchard.Tests/UI/ShapeTests.cs b/src/Orchard.Tests/UI/ShapeTests.cs index cacd829a8..59ea45769 100644 --- a/src/Orchard.Tests/UI/ShapeTests.cs +++ b/src/Orchard.Tests/UI/ShapeTests.cs @@ -7,6 +7,7 @@ using NUnit.Framework; using Orchard.DisplayManagement; using Orchard.DisplayManagement.Descriptors; using Orchard.DisplayManagement.Implementation; +using Orchard.DisplayManagement.Shapes; using Orchard.Environment; using Orchard.Mvc; using Orchard.UI.Zones; @@ -33,7 +34,7 @@ namespace Orchard.Tests.UI { [Test] public void WorkContextPageIsLayoutShape() { var page = _workContext.Page; - IShapeMetadata pageMetadata = page.Metadata; + ShapeMetadata pageMetadata = page.Metadata; Assert.That(pageMetadata.Type, Is.EqualTo("Layout")); Assert.That(page.Metadata.Type, Is.EqualTo("Layout")); } diff --git a/src/Orchard.Web/Themes/SafeMode/Views/Document.aspx b/src/Orchard.Web/Themes/SafeMode/Views/Document.aspx index 3aae761bf..c51931447 100644 --- a/src/Orchard.Web/Themes/SafeMode/Views/Document.aspx +++ b/src/Orchard.Web/Themes/SafeMode/Views/Document.aspx @@ -1,17 +1,20 @@ -<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> +<%@ Page Language="C#" Inherits="Orchard.Mvc.ViewPage" %> <%@ Import Namespace="Orchard.Mvc.ViewModels"%> <%@ Import Namespace="Orchard.Mvc.Html" %> <%: Html.Title() %> - " /><% + " /> + <%--<% //todo: (heskew) have resource modules that can be leaned on (like a jQuery module that knows about various CDNs and jQuery's version and min naming schemes) //todo: (heskew) this is an interim solution to inlude jQuery in every page and still allow that to be overriden in some theme by it containing a headScripts partial - Html.Zone("head", ":metas :styles :scripts"); %> + Html.Zone("head", ":metas :styles :scripts"); %>--%> + <%:Display(Model.Head) %> -<% - Html.ZoneBody("body"); %> + +<% Model.Body.Add(Model.Metadata.ChildContent, "5"); %> +<%: Display(Model.Body) %> diff --git a/src/Orchard.Web/Themes/SafeMode/Views/Layout.ascx b/src/Orchard.Web/Themes/SafeMode/Views/Layout.ascx index a7e5f555d..e55261bbb 100644 --- a/src/Orchard.Web/Themes/SafeMode/Views/Layout.ascx +++ b/src/Orchard.Web/Themes/SafeMode/Views/Layout.ascx @@ -1,5 +1,4 @@ <%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %> - <%-- //todo: (heskew) this should really be using the IResourceManager if it's to be a theme especially for the jquery dep (w/out needing to copy into this theme...) var jquery = ResolveUrl("~/Modules/Orchard.Themes/Scripts/jquery-1.4.2.js"); Model.Zones.AddAction("head:scripts", html => @@ -16,11 +15,14 @@ var ie6Css = ResolveUrl("../Styles/ie6.css"); Model.Zones.AddAction("head:styles", html => html.ViewContext.Writer.Write(@"")); - --%> +--%>
- + <% Model.Content.Add(Model.Metadata.ChildContent, "5"); %> <%: Display(Model.Content) %>
diff --git a/src/Orchard.Web/Themes/SafeMode/Views/Zone.ascx b/src/Orchard.Web/Themes/SafeMode/Views/Zone.ascx index bbe85bf58..d7537aeca 100644 --- a/src/Orchard.Web/Themes/SafeMode/Views/Zone.ascx +++ b/src/Orchard.Web/Themes/SafeMode/Views/Zone.ascx @@ -1,4 +1,4 @@ <%@ Control Language="C#" Inherits="Orchard.Mvc.ViewUserControl" %>
- <%foreach (var item in Model.Items) {%><%:Display(item)%><%}%> + <%foreach (var item in Model) {%><%:Display(item)%><%}%>
diff --git a/src/Orchard/DisplayManagement/Descriptors/ShapeDescriptor.cs b/src/Orchard/DisplayManagement/Descriptors/ShapeDescriptor.cs index 838ee9a40..fbe201bb7 100644 --- a/src/Orchard/DisplayManagement/Descriptors/ShapeDescriptor.cs +++ b/src/Orchard/DisplayManagement/Descriptors/ShapeDescriptor.cs @@ -1,10 +1,17 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Web; using Orchard.DisplayManagement.Implementation; namespace Orchard.DisplayManagement.Descriptors { public class ShapeDescriptor { + public ShapeDescriptor() { + Creating = Enumerable.Empty>(); + Created = Enumerable.Empty>(); + FrameTypes = new List(); + } + public string ShapeType { get; set; } /// @@ -16,7 +23,8 @@ namespace Orchard.DisplayManagement.Descriptors { public Func Binding { get; set; } public IEnumerable> Creating {get;set;} - public IEnumerable> Created {get;set;} + + public IList FrameTypes { get; set; } } -} \ No newline at end of file +} diff --git a/src/Orchard/DisplayManagement/IShape.cs b/src/Orchard/DisplayManagement/IShape.cs index cad3c2fbc..5ec1483cb 100644 --- a/src/Orchard/DisplayManagement/IShape.cs +++ b/src/Orchard/DisplayManagement/IShape.cs @@ -1,10 +1,12 @@ -namespace Orchard.DisplayManagement { +using Orchard.DisplayManagement.Shapes; + +namespace Orchard.DisplayManagement { /// /// Interface present on dynamic shapes. /// May be used to access attributes in a strongly typed fashion. /// Note: Anything on this interface is a reserved word for the purpose of shape properties /// public interface IShape { - IShapeMetadata Metadata { get; set; } + ShapeMetadata Metadata { get; set; } } } \ No newline at end of file diff --git a/src/Orchard/DisplayManagement/IShapeMetadata.cs b/src/Orchard/DisplayManagement/IShapeMetadata.cs deleted file mode 100644 index e14fc321a..000000000 --- a/src/Orchard/DisplayManagement/IShapeMetadata.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Orchard.DisplayManagement { - public interface IShapeMetadata { - string Type { get; set; } - string Position { get; set; } - bool WasExecuted { get; set; } - } -} diff --git a/src/Orchard/DisplayManagement/Implementation/DefaultDisplayManager.cs b/src/Orchard/DisplayManagement/Implementation/DefaultDisplayManager.cs index 5e0272625..ea8fe63b1 100644 --- a/src/Orchard/DisplayManagement/Implementation/DefaultDisplayManager.cs +++ b/src/Orchard/DisplayManagement/Implementation/DefaultDisplayManager.cs @@ -51,10 +51,20 @@ namespace Orchard.DisplayManagement.Implementation { ShapeDescriptor shapeDescriptor; if (shapeTable.Descriptors.TryGetValue(shapeMetadata.Type, out shapeDescriptor)) { - return Process(shapeDescriptor, shape, context); + shape.Metadata.ChildContent = Process(shapeDescriptor, shape, context); } - //postproc / content html alteration/wrapping/etc - throw new OrchardException(T("Shape type {0} not found", shapeMetadata.Type)); + else { + throw new OrchardException(T("Shape type {0} not found", shapeMetadata.Type)); + } + + foreach (var frameType in shape.Metadata.FrameTypes) { + ShapeDescriptor frameDescriptor; + if (shapeTable.Descriptors.TryGetValue(frameType, out frameDescriptor)) { + shape.Metadata.ChildContent = Process(frameDescriptor, shape, context); + } + } + + return shape.Metadata.ChildContent; } private IHtmlString CoerceHtmlString(object value) { @@ -68,7 +78,7 @@ namespace Orchard.DisplayManagement.Implementation { return new HtmlString(HttpUtility.HtmlEncode(value)); } - private IHtmlString Process(ShapeDescriptor shapeDescriptor, IShape shape, DisplayContext context) { + private IHtmlString Process(ShapeDescriptor shapeDescriptor, IShape shape, DisplayContext context) { return CoerceHtmlString(shapeDescriptor.Binding(context)); } @@ -83,9 +93,10 @@ namespace Orchard.DisplayManagement.Implementation { public override DynamicMetaObject FallbackConvert(DynamicMetaObject target, DynamicMetaObject errorSuggestion) { // adjust the normal csharp convert binder to allow failure to become null. // this causes the same net effect as the "as" keyword, but may be applied to dynamic objects - return _innerBinder.FallbackConvert( + var result = _innerBinder.FallbackConvert( target, errorSuggestion ?? new DynamicMetaObject(Expression.Default(_innerBinder.ReturnType), GetTypeRestriction(target))); + return result; } static BindingRestrictions GetTypeRestriction(DynamicMetaObject obj) { diff --git a/src/Orchard/DisplayManagement/Implementation/DefaultShapeFactory.cs b/src/Orchard/DisplayManagement/Implementation/DefaultShapeFactory.cs index 23708b22b..9f746cb0e 100644 --- a/src/Orchard/DisplayManagement/Implementation/DefaultShapeFactory.cs +++ b/src/Orchard/DisplayManagement/Implementation/DefaultShapeFactory.cs @@ -85,7 +85,7 @@ namespace Orchard.DisplayManagement.Implementation { foreach (var ev in _events) { ev.Value.Creating(creatingContext); } - if (shapeDescriptor != null && shapeDescriptor.Creating != null) { + if (shapeDescriptor != null) { foreach (var ev in shapeDescriptor.Creating) { ev(creatingContext); } @@ -97,13 +97,17 @@ namespace Orchard.DisplayManagement.Implementation { ShapeType = creatingContext.ShapeType, Shape = ClayActivator.CreateInstance(creatingContext.BaseType, creatingContext.Behaviors) }; - createdContext.Shape.Metadata = new ShapeMetadata { Type = shapeType }; + var shapeMetadata = new ShapeMetadata { Type = shapeType }; + createdContext.Shape.Metadata = shapeMetadata; + + if (shapeDescriptor != null) + shapeMetadata.FrameTypes = shapeMetadata.FrameTypes.Concat(shapeDescriptor.FrameTypes).ToList(); // "created" events provides default values and new object initialization foreach (var ev in _events) { ev.Value.Created(createdContext); } - if (shapeDescriptor != null && shapeDescriptor.Created != null) { + if (shapeDescriptor != null) { foreach (var ev in shapeDescriptor.Created) { ev(createdContext); } diff --git a/src/Orchard/DisplayManagement/Shapes/Shape.cs b/src/Orchard/DisplayManagement/Shapes/Shape.cs index d7c95254d..95f3cc408 100644 --- a/src/Orchard/DisplayManagement/Shapes/Shape.cs +++ b/src/Orchard/DisplayManagement/Shapes/Shape.cs @@ -1,5 +1,5 @@ namespace Orchard.DisplayManagement.Shapes { public class Shape : IShape { - public virtual IShapeMetadata Metadata { get; set; } + public virtual ShapeMetadata Metadata { get; set; } } } diff --git a/src/Orchard/DisplayManagement/Shapes/ShapeMetadata.cs b/src/Orchard/DisplayManagement/Shapes/ShapeMetadata.cs index e25072d1c..2aa5cb810 100644 --- a/src/Orchard/DisplayManagement/Shapes/ShapeMetadata.cs +++ b/src/Orchard/DisplayManagement/Shapes/ShapeMetadata.cs @@ -1,7 +1,18 @@ -namespace Orchard.DisplayManagement.Shapes { - public class ShapeMetadata : IShapeMetadata { +using System.Collections.Generic; +using System.Linq; +using System.Web; + +namespace Orchard.DisplayManagement.Shapes { + public class ShapeMetadata { + public ShapeMetadata() { + FrameTypes = new List(); + } + public string Type { get; set; } public string Position { get; set; } + public IList FrameTypes { get; set; } + public bool WasExecuted { get; set; } + public IHtmlString ChildContent { get; set; } } } \ No newline at end of file diff --git a/src/Orchard/Mvc/ViewEngines/ThemeAwareness/LayoutAwareViewEngine.cs b/src/Orchard/Mvc/ViewEngines/ThemeAwareness/LayoutAwareViewEngine.cs index 0ff3242a2..ea3f31881 100644 --- a/src/Orchard/Mvc/ViewEngines/ThemeAwareness/LayoutAwareViewEngine.cs +++ b/src/Orchard/Mvc/ViewEngines/ThemeAwareness/LayoutAwareViewEngine.cs @@ -27,23 +27,24 @@ namespace Orchard.Mvc.ViewEngines.ThemeAwareness { } public ViewEngineResult FindView(ControllerContext controllerContext, string viewName, string masterName, bool useCache) { - var findBody = _themeAwareViewEngine.FindPartialView(controllerContext, viewName, useCache, true); + var viewResult = _themeAwareViewEngine.FindPartialView(controllerContext, viewName, useCache, true); - if (findBody.View == null) { - return findBody; + if (viewResult.View == null) { + return viewResult; } var layoutView = new LayoutView((viewContext, writer, viewDataContainer) => { var buffer = new StringWriter(); - findBody.View.Render(viewContext, buffer); - _workContext.Page.Zones.Content.Add(new HtmlString(buffer.ToString()), "5"); + viewResult.View.Render(viewContext, buffer); + + _workContext.Page.Metadata.ChildContent = new HtmlString(buffer.ToString()); var display = _displayHelperFactory.CreateHelper(viewContext, viewDataContainer); IHtmlString result = display(_workContext.Page); writer.Write(result.ToHtmlString()); - }, (context, view) => findBody.ViewEngine.ReleaseView(context, findBody.View)); + }, (context, view) => viewResult.ViewEngine.ReleaseView(context, viewResult.View)); return new ViewEngineResult(layoutView, this); } diff --git a/src/Orchard/Mvc/ViewPage.cs b/src/Orchard/Mvc/ViewPage.cs index b4cbb8bed..d6e41a671 100644 --- a/src/Orchard/Mvc/ViewPage.cs +++ b/src/Orchard/Mvc/ViewPage.cs @@ -20,7 +20,7 @@ namespace Orchard.Mvc { public override void InitHelpers() { base.InitHelpers(); - + var workContext = ViewContext.GetWorkContext(); workContext.Resolve().InjectUnsetProperties(this); @@ -36,4 +36,7 @@ namespace Orchard.Mvc { return Authorizer.Authorize(permission); } } + + public class ViewPage : ViewPage { + } } \ No newline at end of file diff --git a/src/Orchard/Mvc/ViewUserControl.cs b/src/Orchard/Mvc/ViewUserControl.cs index 51e9ea406..2da63a65b 100644 --- a/src/Orchard/Mvc/ViewUserControl.cs +++ b/src/Orchard/Mvc/ViewUserControl.cs @@ -1,3 +1,4 @@ +using System.Web; using System.Web.Mvc; using Autofac; using Orchard.DisplayManagement; diff --git a/src/Orchard/Orchard.Framework.csproj b/src/Orchard/Orchard.Framework.csproj index 166c993e7..5ffa8665e 100644 --- a/src/Orchard/Orchard.Framework.csproj +++ b/src/Orchard/Orchard.Framework.csproj @@ -391,7 +391,6 @@ - diff --git a/src/Orchard/UI/IPage.cs b/src/Orchard/UI/IPage.cs index e1ac2bc7e..0004e4c64 100644 --- a/src/Orchard/UI/IPage.cs +++ b/src/Orchard/UI/IPage.cs @@ -25,7 +25,7 @@ namespace Orchard.UI { } } - public interface IZone { + public interface IZone : IEnumerable { string ZoneName { get; set; } IZone Add(object item); IZone Add(object item, string position); @@ -63,5 +63,9 @@ namespace Orchard.UI { return _items; } } + + public virtual IEnumerator GetEnumerator() { + return _items.GetEnumerator(); + } } } diff --git a/src/Orchard/UI/Zones/PageWorkContext.cs b/src/Orchard/UI/Zones/PageWorkContext.cs index 9e5f9fc63..04266cccf 100644 --- a/src/Orchard/UI/Zones/PageWorkContext.cs +++ b/src/Orchard/UI/Zones/PageWorkContext.cs @@ -23,14 +23,16 @@ namespace Orchard.UI.Zones { public class CoreShapes : IShapeDescriptorBindingStrategy { public void Discover(ShapeTableBuilder builder) { var feature = new FeatureDescriptor { + Name = "Orchard.Framework", + Extension = new ExtensionDescriptor { Name = "Orchard.Framework", - Extension = new ExtensionDescriptor { - Name = "Orchard.Framework", - ExtensionType = "Module", - } - }; + ExtensionType = "Module", + } + }; + builder.Describe.Named("Layout").From(feature) - .OnCreating(context => context.Behaviors.Add(new ZoneHoldingBehavior(context.ShapeFactory))); + .OnCreating(context => context.Behaviors.Add(new ZoneHoldingBehavior(context.ShapeFactory))) + .Configure(d => d.FrameTypes.Add("Document")); builder.Describe.Named("Zone").From(feature) .OnCreating(context => context.BaseType = typeof(Zone));