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 ThemeZoneName1 = "sidebar";
|
||||||
private const string ThemeZoneName2 = "alternative";
|
private const string ThemeZoneName2 = "alternative";
|
||||||
|
private const string DuplicateZoneNames = "sidebar,alternative, sidebar , alternative ";
|
||||||
|
|
||||||
private const string LayerName1 = "Test layer 1";
|
private const string LayerName1 = "Test layer 1";
|
||||||
private const string LayerDescription1 = "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) {
|
public override void Register(ContainerBuilder builder) {
|
||||||
var mockFeatureManager = new Mock<IFeatureManager>();
|
var mockFeatureManager = new Mock<IFeatureManager>();
|
||||||
|
|
||||||
var theme1 = new FeatureDescriptor {Extension = new ExtensionDescriptor {Zones = ThemeZoneName1}};
|
var theme1 = new FeatureDescriptor {Extension = new ExtensionDescriptor { Zones = ThemeZoneName1, ExtensionType = "Theme" }};
|
||||||
var theme2 = new FeatureDescriptor {Extension = new ExtensionDescriptor {Zones = ThemeZoneName2}};
|
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())
|
mockFeatureManager.Setup(x => x.GetEnabledFeatures())
|
||||||
.Returns(new[] { theme1, theme2 });
|
.Returns(new[] { theme1, theme2, theme3, module1 });
|
||||||
|
|
||||||
builder.RegisterType<DefaultContentManager>().As<IContentManager>();
|
builder.RegisterType<DefaultContentManager>().As<IContentManager>();
|
||||||
builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>();
|
builder.RegisterType<DefaultContentManagerSession>().As<IContentManagerSession>();
|
||||||
@@ -200,10 +203,10 @@ namespace Orchard.Tests.Modules.Widgets.Services {
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
[Ignore("Needs fixing")]
|
//[Ignore("Needs fixing")]
|
||||||
public void GetZonesTest() {
|
public void GetZonesTest() {
|
||||||
IEnumerable<string> zones = _widgetService.GetZones();
|
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 == ThemeZoneName1), Is.Not.Null);
|
||||||
Assert.That(zones.FirstOrDefault(zone => zone == ThemeZoneName2), 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 Autofac;
|
||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
using Orchard.Environment;
|
using Orchard.Environment;
|
||||||
@@ -11,5 +13,34 @@ namespace Orchard.Tests.Environment {
|
|||||||
var host = OrchardStarter.CreateHost(b => b.RegisterInstance(new ControllerBuilder()));
|
var host = OrchardStarter.CreateHost(b => b.RegisterInstance(new ControllerBuilder()));
|
||||||
Assert.That(host, Is.TypeOf<DefaultOrchardHost>());
|
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.Containers.Models;
|
||||||
using Orchard.Core.Routable.Models;
|
using Orchard.Core.Routable.Models;
|
||||||
using Orchard.DisplayManagement;
|
using Orchard.DisplayManagement;
|
||||||
|
using Orchard.Mvc;
|
||||||
using Orchard.Themes;
|
using Orchard.Themes;
|
||||||
using Orchard.UI.Navigation;
|
using Orchard.UI.Navigation;
|
||||||
using Orchard.Settings;
|
using Orchard.Settings;
|
||||||
@@ -71,14 +72,16 @@ namespace Orchard.Core.Containers.Controllers {
|
|||||||
|
|
||||||
var list = Shape.List();
|
var list = Shape.List();
|
||||||
list.AddRange(pageOfItems.Select(item => _contentManager.BuildDisplay(item, "Summary")));
|
list.AddRange(pageOfItems.Select(item => _contentManager.BuildDisplay(item, "Summary")));
|
||||||
|
list.Classes.Add("content-items");
|
||||||
|
list.Classes.Add("list-items");
|
||||||
|
|
||||||
dynamic viewModel = Shape.ViewModel()
|
var model = _contentManager.BuildDisplay(container, "Detail");
|
||||||
.ContentItems(list)
|
model.Content.Add(list, "7");
|
||||||
.Pager(pagerShape)
|
if (container.As<ContainerPart>().Record.Paginated) {
|
||||||
.ShowPager(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 new ShapeResult(this, model);
|
||||||
return View((object)viewModel);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -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\Placement.info" />
|
||||||
<Content Include="Containers\Views\EditorTemplates\ContainerWidget.cshtml" />
|
<Content Include="Containers\Views\EditorTemplates\ContainerWidget.cshtml" />
|
||||||
<Content Include="Containers\Views\EditorTemplates\Container.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\ContainerPartSettings.cshtml" />
|
||||||
<Content Include="Containers\Views\DefinitionTemplates\ContainerTypePartSettings.cshtml" />
|
<Content Include="Containers\Views\DefinitionTemplates\ContainerTypePartSettings.cshtml" />
|
||||||
<Content Include="Containers\Views\EditorTemplates\Containable.cshtml" />
|
<Content Include="Containers\Views\EditorTemplates\Containable.cshtml" />
|
||||||
|
@@ -2,8 +2,6 @@
|
|||||||
@{
|
@{
|
||||||
Style.Require("ContentTypesAdmin");
|
Style.Require("ContentTypesAdmin");
|
||||||
Script.Require("jQuery");
|
Script.Require("jQuery");
|
||||||
Script.Include("admin.js");
|
|
||||||
|
|
||||||
Layout.Title = T("Edit Content Type").ToString();
|
Layout.Title = T("Edit Content Type").ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -2,8 +2,6 @@
|
|||||||
@{
|
@{
|
||||||
Style.Require("ContentTypesAdmin");
|
Style.Require("ContentTypesAdmin");
|
||||||
Script.Require("jQuery");
|
Script.Require("jQuery");
|
||||||
Script.Include("admin.js");
|
|
||||||
|
|
||||||
Layout.Title = T("Edit Part").ToString();
|
Layout.Title = T("Edit Part").ToString();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -3,7 +3,12 @@
|
|||||||
<!--
|
<!--
|
||||||
Parts_Container_Contained_SummaryAdmin
|
Parts_Container_Contained_SummaryAdmin
|
||||||
-->
|
-->
|
||||||
<Match DisplayType="SummaryAdmin">
|
<Match ContentType="List" DisplayType="Detail">
|
||||||
<Place Parts_Container_Contained_SummaryAdmin="Actions:10"/>
|
<!-- don't show the List title or Common Metadata -->
|
||||||
</Match>
|
<Place Parts_RoutableTitle="-" />
|
||||||
|
<Place Parts_Common_Metadata="-" />
|
||||||
|
</Match>
|
||||||
|
<Match DisplayType="SummaryAdmin">
|
||||||
|
<Place Parts_Container_Contained_SummaryAdmin="Actions:10"/>
|
||||||
|
</Match>
|
||||||
</Placement>
|
</Placement>
|
||||||
|
@@ -2,8 +2,6 @@
|
|||||||
using Orchard.ContentManagement;
|
using Orchard.ContentManagement;
|
||||||
using Orchard.Environment.Extensions;
|
using Orchard.Environment.Extensions;
|
||||||
using Orchard.Environment.Extensions.Models;
|
using Orchard.Environment.Extensions.Models;
|
||||||
using Orchard.Localization;
|
|
||||||
using Orchard.Logging;
|
|
||||||
using Orchard.Themes.Models;
|
using Orchard.Themes.Models;
|
||||||
|
|
||||||
namespace Orchard.Themes.Services {
|
namespace Orchard.Themes.Services {
|
||||||
@@ -17,7 +15,6 @@ namespace Orchard.Themes.Services {
|
|||||||
public const string CurrentThemeSignal = "SiteCurrentTheme";
|
public const string CurrentThemeSignal = "SiteCurrentTheme";
|
||||||
|
|
||||||
private readonly IExtensionManager _extensionManager;
|
private readonly IExtensionManager _extensionManager;
|
||||||
private readonly IWorkContextAccessor _workContextAccessor;
|
|
||||||
private readonly ICacheManager _cacheManager;
|
private readonly ICacheManager _cacheManager;
|
||||||
private readonly ISignals _signals;
|
private readonly ISignals _signals;
|
||||||
private readonly IOrchardServices _orchardServices;
|
private readonly IOrchardServices _orchardServices;
|
||||||
@@ -25,22 +22,14 @@ namespace Orchard.Themes.Services {
|
|||||||
public SiteThemeService(
|
public SiteThemeService(
|
||||||
IOrchardServices orchardServices,
|
IOrchardServices orchardServices,
|
||||||
IExtensionManager extensionManager,
|
IExtensionManager extensionManager,
|
||||||
IWorkContextAccessor workContextAccessor,
|
|
||||||
ICacheManager cacheManager,
|
ICacheManager cacheManager,
|
||||||
ISignals signals) {
|
ISignals signals) {
|
||||||
|
|
||||||
_orchardServices = orchardServices;
|
_orchardServices = orchardServices;
|
||||||
_extensionManager = extensionManager;
|
_extensionManager = extensionManager;
|
||||||
_workContextAccessor = workContextAccessor;
|
|
||||||
_cacheManager = cacheManager;
|
_cacheManager = cacheManager;
|
||||||
_signals = signals;
|
_signals = signals;
|
||||||
|
|
||||||
Logger = NullLogger.Instance;
|
|
||||||
|
|
||||||
T = NullLocalizer.Instance;
|
|
||||||
}
|
}
|
||||||
public Localizer T { get; set; }
|
|
||||||
public ILogger Logger { get; set; }
|
|
||||||
|
|
||||||
public ExtensionDescriptor GetSiteTheme() {
|
public ExtensionDescriptor GetSiteTheme() {
|
||||||
string currentThemeName = GetCurrentThemeName();
|
string currentThemeName = GetCurrentThemeName();
|
||||||
@@ -48,7 +37,7 @@ namespace Orchard.Themes.Services {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void SetSiteTheme(string themeName) {
|
public void SetSiteTheme(string themeName) {
|
||||||
var site = _workContextAccessor.GetContext().CurrentSite;
|
var site = _orchardServices.WorkContext.CurrentSite;
|
||||||
site.As<ThemeSiteSettingsPart>().CurrentThemeName = themeName;
|
site.As<ThemeSiteSettingsPart>().CurrentThemeName = themeName;
|
||||||
|
|
||||||
_signals.Trigger(CurrentThemeSignal);
|
_signals.Trigger(CurrentThemeSignal);
|
||||||
|
@@ -69,9 +69,9 @@ namespace Orchard.Widgets.Services {
|
|||||||
return _featureManager.GetEnabledFeatures()
|
return _featureManager.GetEnabledFeatures()
|
||||||
.Select(x => x.Extension)
|
.Select(x => x.Extension)
|
||||||
.Where(x => DefaultExtensionTypes.IsTheme(x.ExtensionType) && x.Zones != null)
|
.Where(x => DefaultExtensionTypes.IsTheme(x.ExtensionType) && x.Zones != null)
|
||||||
.SelectMany(x => x.Zones.Split(','))
|
.SelectMany(x => x.Zones.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries))
|
||||||
.Distinct()
|
|
||||||
.Select(x => x.Trim())
|
.Select(x => x.Trim())
|
||||||
|
.Distinct()
|
||||||
.ToArray();
|
.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,9 +80,9 @@ namespace Orchard.Widgets.Services {
|
|||||||
|
|
||||||
// get the zones for this theme
|
// get the zones for this theme
|
||||||
if (theme.Zones != null)
|
if (theme.Zones != null)
|
||||||
zones = theme.Zones.Split(',')
|
zones = theme.Zones.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries)
|
||||||
.Distinct()
|
|
||||||
.Select(x => x.Trim())
|
.Select(x => x.Trim())
|
||||||
|
.Distinct()
|
||||||
.ToList();
|
.ToList();
|
||||||
|
|
||||||
// if this theme has no zones defined then walk the BaseTheme chain until we hit a theme which defines zones
|
// 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;
|
string baseTheme = theme.BaseTheme;
|
||||||
theme = _extensionManager.GetExtension(baseTheme);
|
theme = _extensionManager.GetExtension(baseTheme);
|
||||||
if (theme != null && theme.Zones != null)
|
if (theme != null && theme.Zones != null)
|
||||||
zones = theme.Zones.Split(',')
|
zones = theme.Zones.Split(new [] { ',' }, StringSplitOptions.RemoveEmptyEntries)
|
||||||
.Distinct()
|
|
||||||
.Select(x => x.Trim())
|
.Select(x => x.Trim())
|
||||||
|
.Distinct()
|
||||||
.ToList();
|
.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 class OrchardStarter {
|
||||||
public static IContainer CreateHostContainer(Action<ContainerBuilder> registrations) {
|
public static IContainer CreateHostContainer(Action<ContainerBuilder> registrations) {
|
||||||
var builder = new ContainerBuilder();
|
var builder = new ContainerBuilder();
|
||||||
|
builder.RegisterModule(new CollectionOrderModule());
|
||||||
builder.RegisterModule(new LoggingModule());
|
builder.RegisterModule(new LoggingModule());
|
||||||
builder.RegisterModule(new EventsModule());
|
builder.RegisterModule(new EventsModule());
|
||||||
builder.RegisterModule(new CacheModule());
|
builder.RegisterModule(new CacheModule());
|
||||||
|
@@ -56,7 +56,6 @@ namespace Orchard.Mvc {
|
|||||||
return (Type) info.Metadata["ControllerType"];
|
return (Type) info.Metadata["ControllerType"];
|
||||||
}
|
}
|
||||||
|
|
||||||
// fail as appropriate for MVC's expectations
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,7 +73,7 @@ namespace Orchard.Mvc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// fail as appropriate for MVC's expectations
|
// 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\Implementation\IShapeFactoryEvents.cs" />
|
||||||
<Compile Include="DisplayManagement\Shapes\ShapeDebugView.cs" />
|
<Compile Include="DisplayManagement\Shapes\ShapeDebugView.cs" />
|
||||||
<Compile Include="DisplayManagement\Shapes\ITagBuilderFactory.cs" />
|
<Compile Include="DisplayManagement\Shapes\ITagBuilderFactory.cs" />
|
||||||
|
<Compile Include="Environment\CollectionOrderModule.cs" />
|
||||||
<Compile Include="Environment\Extensions\OrchardSuppressDependencyAttribute.cs" />
|
<Compile Include="Environment\Extensions\OrchardSuppressDependencyAttribute.cs" />
|
||||||
<Compile Include="Environment\Features\IFeatureManager.cs" />
|
<Compile Include="Environment\Features\IFeatureManager.cs" />
|
||||||
<Compile Include="Environment\IAssemblyNameResolver.cs" />
|
<Compile Include="Environment\IAssemblyNameResolver.cs" />
|
||||||
|
Reference in New Issue
Block a user