mirror of
https://github.com/OrchardCMS/Orchard.git
synced 2025-09-23 04:43:35 +08:00
Merge
--HG-- branch : 1.x
This commit is contained in:
@@ -31,6 +31,7 @@ namespace Orchard.Tests.Modules.Widgets.Services {
|
||||
|
||||
private const string ThemeZoneName1 = "sidebar";
|
||||
private const string ThemeZoneName2 = "alternative";
|
||||
private const string DuplicateZoneNames = "sidebar,alternative, sidebar , alternative ";
|
||||
|
||||
private const string LayerName1 = "Test layer 1";
|
||||
private const string LayerDescription1 = "Test layer 1";
|
||||
@@ -78,10 +79,12 @@ namespace Orchard.Tests.Modules.Widgets.Services {
|
||||
public override void Register(ContainerBuilder builder) {
|
||||
var mockFeatureManager = new Mock<IFeatureManager>();
|
||||
|
||||
var theme1 = new FeatureDescriptor {Extension = new ExtensionDescriptor {Zones = ThemeZoneName1}};
|
||||
var theme2 = new FeatureDescriptor {Extension = new ExtensionDescriptor {Zones = ThemeZoneName2}};
|
||||
var theme1 = new FeatureDescriptor {Extension = new ExtensionDescriptor { Zones = ThemeZoneName1, ExtensionType = "Theme" }};
|
||||
var theme2 = new FeatureDescriptor { Extension = new ExtensionDescriptor { Zones = ThemeZoneName2, ExtensionType = "Theme" } };
|
||||
var theme3 = new FeatureDescriptor { Extension = new ExtensionDescriptor { Zones = DuplicateZoneNames, ExtensionType = "Theme" } };
|
||||
var module1 = new FeatureDescriptor { Extension = new ExtensionDescriptor { Zones = "DontSeeMeBecauseIAmNotATheme", ExtensionType = "Module" } };
|
||||
mockFeatureManager.Setup(x => x.GetEnabledFeatures())
|
||||
.Returns(new[] { theme1, theme2 });
|
||||
.Returns(new[] { theme1, theme2, theme3, module1 });
|
||||
|
||||
builder.RegisterType<DefaultContentManager>().As<IContentManager>();
|
||||
builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>();
|
||||
@@ -200,10 +203,10 @@ namespace Orchard.Tests.Modules.Widgets.Services {
|
||||
}
|
||||
|
||||
[Test]
|
||||
[Ignore("Needs fixing")]
|
||||
//[Ignore("Needs fixing")]
|
||||
public void GetZonesTest() {
|
||||
IEnumerable<string> zones = _widgetService.GetZones();
|
||||
Assert.That(zones.Count(), Is.EqualTo(2), "One zone on the mock list");
|
||||
Assert.That(zones.Count(), Is.EqualTo(2), "Two zones on the mock list");
|
||||
Assert.That(zones.FirstOrDefault(zone => zone == ThemeZoneName1), Is.Not.Null);
|
||||
Assert.That(zones.FirstOrDefault(zone => zone == ThemeZoneName2), Is.Not.Null);
|
||||
}
|
||||
|
@@ -1,4 +1,6 @@
|
||||
using System.Web.Mvc;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Web.Mvc;
|
||||
using Autofac;
|
||||
using NUnit.Framework;
|
||||
using Orchard.Environment;
|
||||
@@ -11,5 +13,34 @@ namespace Orchard.Tests.Environment {
|
||||
var host = OrchardStarter.CreateHost(b => b.RegisterInstance(new ControllerBuilder()));
|
||||
Assert.That(host, Is.TypeOf<DefaultOrchardHost>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void ContainerResolvesServicesInSameOrderTheyAreRegistered() {
|
||||
var container = OrchardStarter.CreateHostContainer(builder => {
|
||||
builder.RegisterType<Component1>().As<IServiceA>();
|
||||
builder.RegisterType<Component2>().As<IServiceA>();
|
||||
});
|
||||
var services = container.Resolve<IEnumerable<IServiceA>>();
|
||||
Assert.That(services.Count(), Is.EqualTo(2));
|
||||
Assert.That(services.First(), Is.TypeOf<Component1>());
|
||||
Assert.That(services.Last(), Is.TypeOf<Component2>());
|
||||
}
|
||||
|
||||
[Test]
|
||||
public void MostRecentlyRegisteredServiceReturnsFromSingularResolve() {
|
||||
var container = OrchardStarter.CreateHostContainer(builder => {
|
||||
builder.RegisterType<Component1>().As<IServiceA>();
|
||||
builder.RegisterType<Component2>().As<IServiceA>();
|
||||
});
|
||||
var service = container.Resolve<IServiceA>();
|
||||
Assert.That(service, Is.Not.Null);
|
||||
Assert.That(service, Is.TypeOf<Component2>());
|
||||
}
|
||||
|
||||
public interface IServiceA {}
|
||||
|
||||
public class Component1 : IServiceA {}
|
||||
|
||||
public class Component2 : IServiceA {}
|
||||
}
|
||||
}
|
@@ -7,6 +7,7 @@ using Orchard.Core.Containers.Extensions;
|
||||
using Orchard.Core.Containers.Models;
|
||||
using Orchard.Core.Routable.Models;
|
||||
using Orchard.DisplayManagement;
|
||||
using Orchard.Mvc;
|
||||
using Orchard.Themes;
|
||||
using Orchard.UI.Navigation;
|
||||
using Orchard.Settings;
|
||||
@@ -71,14 +72,16 @@ namespace Orchard.Core.Containers.Controllers {
|
||||
|
||||
var list = Shape.List();
|
||||
list.AddRange(pageOfItems.Select(item => _contentManager.BuildDisplay(item, "Summary")));
|
||||
list.Classes.Add("content-items");
|
||||
list.Classes.Add("list-items");
|
||||
|
||||
dynamic viewModel = Shape.ViewModel()
|
||||
.ContentItems(list)
|
||||
.Pager(pagerShape)
|
||||
.ShowPager(container.As<ContainerPart>().Record.Paginated);
|
||||
var model = _contentManager.BuildDisplay(container, "Detail");
|
||||
model.Content.Add(list, "7");
|
||||
if (container.As<ContainerPart>().Record.Paginated) {
|
||||
model.Content.Add(pagerShape, "7.5");
|
||||
}
|
||||
|
||||
// Casting to avoid invalid (under medium trust) reflection over the protected View method and force a static invocation.
|
||||
return View((object)viewModel);
|
||||
return new ShapeResult(this, model);
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,9 +0,0 @@
|
||||
@{
|
||||
IEnumerable<object> items = Model.ContentItems;
|
||||
Model.ContentItems.Classes.Add("content-items");
|
||||
Model.ContentItems.Classes.Add("list-items");
|
||||
}
|
||||
@Display(items)
|
||||
@if (Model.ShowPager) {
|
||||
@Display(Model.Pager)
|
||||
}
|
@@ -386,7 +386,6 @@
|
||||
<Content Include="Containers\Placement.info" />
|
||||
<Content Include="Containers\Views\EditorTemplates\ContainerWidget.cshtml" />
|
||||
<Content Include="Containers\Views\EditorTemplates\Container.cshtml" />
|
||||
<Content Include="Containers\Views\Item\Display.cshtml" />
|
||||
<Content Include="Containers\Views\DefinitionTemplates\ContainerPartSettings.cshtml" />
|
||||
<Content Include="Containers\Views\DefinitionTemplates\ContainerTypePartSettings.cshtml" />
|
||||
<Content Include="Containers\Views\EditorTemplates\Containable.cshtml" />
|
||||
|
@@ -2,8 +2,6 @@
|
||||
@{
|
||||
Style.Require("ContentTypesAdmin");
|
||||
Script.Require("jQuery");
|
||||
Script.Include("admin.js");
|
||||
|
||||
Layout.Title = T("Edit Content Type").ToString();
|
||||
}
|
||||
|
||||
|
@@ -2,8 +2,6 @@
|
||||
@{
|
||||
Style.Require("ContentTypesAdmin");
|
||||
Script.Require("jQuery");
|
||||
Script.Include("admin.js");
|
||||
|
||||
Layout.Title = T("Edit Part").ToString();
|
||||
}
|
||||
|
||||
|
@@ -3,6 +3,11 @@
|
||||
<!--
|
||||
Parts_Container_Contained_SummaryAdmin
|
||||
-->
|
||||
<Match ContentType="List" DisplayType="Detail">
|
||||
<!-- don't show the List title or Common Metadata -->
|
||||
<Place Parts_RoutableTitle="-" />
|
||||
<Place Parts_Common_Metadata="-" />
|
||||
</Match>
|
||||
<Match DisplayType="SummaryAdmin">
|
||||
<Place Parts_Container_Contained_SummaryAdmin="Actions:10"/>
|
||||
</Match>
|
||||
|
@@ -2,8 +2,6 @@
|
||||
using Orchard.ContentManagement;
|
||||
using Orchard.Environment.Extensions;
|
||||
using Orchard.Environment.Extensions.Models;
|
||||
using Orchard.Localization;
|
||||
using Orchard.Logging;
|
||||
using Orchard.Themes.Models;
|
||||
|
||||
namespace Orchard.Themes.Services {
|
||||
@@ -17,7 +15,6 @@ namespace Orchard.Themes.Services {
|
||||
public const string CurrentThemeSignal = "SiteCurrentTheme";
|
||||
|
||||
private readonly IExtensionManager _extensionManager;
|
||||
private readonly IWorkContextAccessor _workContextAccessor;
|
||||
private readonly ICacheManager _cacheManager;
|
||||
private readonly ISignals _signals;
|
||||
private readonly IOrchardServices _orchardServices;
|
||||
@@ -25,22 +22,14 @@ namespace Orchard.Themes.Services {
|
||||
public SiteThemeService(
|
||||
IOrchardServices orchardServices,
|
||||
IExtensionManager extensionManager,
|
||||
IWorkContextAccessor workContextAccessor,
|
||||
ICacheManager cacheManager,
|
||||
ISignals signals) {
|
||||
|
||||
_orchardServices = orchardServices;
|
||||
_extensionManager = extensionManager;
|
||||
_workContextAccessor = workContextAccessor;
|
||||
_cacheManager = cacheManager;
|
||||
_signals = signals;
|
||||
|
||||
Logger = NullLogger.Instance;
|
||||
|
||||
T = NullLocalizer.Instance;
|
||||
}
|
||||
public Localizer T { get; set; }
|
||||
public ILogger Logger { get; set; }
|
||||
|
||||
public ExtensionDescriptor GetSiteTheme() {
|
||||
string currentThemeName = GetCurrentThemeName();
|
||||
@@ -48,7 +37,7 @@ namespace Orchard.Themes.Services {
|
||||
}
|
||||
|
||||
public void SetSiteTheme(string themeName) {
|
||||
var site = _workContextAccessor.GetContext().CurrentSite;
|
||||
var site = _orchardServices.WorkContext.CurrentSite;
|
||||
site.As<ThemeSiteSettingsPart>().CurrentThemeName = themeName;
|
||||
|
||||
_signals.Trigger(CurrentThemeSignal);
|
||||
|
@@ -69,9 +69,9 @@ namespace Orchard.Widgets.Services {
|
||||
return _featureManager.GetEnabledFeatures()
|
||||
.Select(x => x.Extension)
|
||||
.Where(x => DefaultExtensionTypes.IsTheme(x.ExtensionType) && x.Zones != null)
|
||||
.SelectMany(x => x.Zones.Split(','))
|
||||
.Distinct()
|
||||
.SelectMany(x => x.Zones.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries))
|
||||
.Select(x => x.Trim())
|
||||
.Distinct()
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
@@ -80,9 +80,9 @@ namespace Orchard.Widgets.Services {
|
||||
|
||||
// get the zones for this theme
|
||||
if (theme.Zones != null)
|
||||
zones = theme.Zones.Split(',')
|
||||
.Distinct()
|
||||
zones = theme.Zones.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries)
|
||||
.Select(x => x.Trim())
|
||||
.Distinct()
|
||||
.ToList();
|
||||
|
||||
// if this theme has no zones defined then walk the BaseTheme chain until we hit a theme which defines zones
|
||||
@@ -90,9 +90,9 @@ namespace Orchard.Widgets.Services {
|
||||
string baseTheme = theme.BaseTheme;
|
||||
theme = _extensionManager.GetExtension(baseTheme);
|
||||
if (theme != null && theme.Zones != null)
|
||||
zones = theme.Zones.Split(',')
|
||||
.Distinct()
|
||||
zones = theme.Zones.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries)
|
||||
.Select(x => x.Trim())
|
||||
.Distinct()
|
||||
.ToList();
|
||||
}
|
||||
|
||||
|
23
src/Orchard/Environment/CollectionOrderModule.cs
Normal file
23
src/Orchard/Environment/CollectionOrderModule.cs
Normal file
@@ -0,0 +1,23 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using Autofac.Core;
|
||||
|
||||
namespace Orchard.Environment {
|
||||
internal class CollectionOrderModule : IModule {
|
||||
public void Configure(IComponentRegistry componentRegistry) {
|
||||
componentRegistry.Registered += (sender, registered) => {
|
||||
// only bother watching enumerable resolves
|
||||
var limitType = registered.ComponentRegistration.Activator.LimitType;
|
||||
if (typeof(IEnumerable).IsAssignableFrom(limitType)) {
|
||||
registered.ComponentRegistration.Activated += (sender2, activated) => {
|
||||
// Autofac's IEnumerable feature returns an Array
|
||||
if (activated.Instance is Array) {
|
||||
// Orchard needs FIFO, not FILO, component order
|
||||
Array.Reverse((Array)activated.Instance);
|
||||
}
|
||||
};
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
}
|
@@ -31,6 +31,7 @@ namespace Orchard.Environment {
|
||||
public static class OrchardStarter {
|
||||
public static IContainer CreateHostContainer(Action<ContainerBuilder> registrations) {
|
||||
var builder = new ContainerBuilder();
|
||||
builder.RegisterModule(new CollectionOrderModule());
|
||||
builder.RegisterModule(new LoggingModule());
|
||||
builder.RegisterModule(new EventsModule());
|
||||
builder.RegisterModule(new CacheModule());
|
||||
|
@@ -56,7 +56,6 @@ namespace Orchard.Mvc {
|
||||
return (Type) info.Metadata["ControllerType"];
|
||||
}
|
||||
|
||||
// fail as appropriate for MVC's expectations
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -74,7 +73,7 @@ namespace Orchard.Mvc {
|
||||
}
|
||||
|
||||
// fail as appropriate for MVC's expectations
|
||||
return null;
|
||||
return base.GetControllerInstance(requestContext, controllerType);
|
||||
}
|
||||
}
|
||||
}
|
@@ -174,6 +174,7 @@
|
||||
<Compile Include="DisplayManagement\Implementation\IShapeFactoryEvents.cs" />
|
||||
<Compile Include="DisplayManagement\Shapes\ShapeDebugView.cs" />
|
||||
<Compile Include="DisplayManagement\Shapes\ITagBuilderFactory.cs" />
|
||||
<Compile Include="Environment\CollectionOrderModule.cs" />
|
||||
<Compile Include="Environment\Extensions\OrchardSuppressDependencyAttribute.cs" />
|
||||
<Compile Include="Environment\Features\IFeatureManager.cs" />
|
||||
<Compile Include="Environment\IAssemblyNameResolver.cs" />
|
||||
|
Reference in New Issue
Block a user