From 85f8b1d03b1f76020e31d3fe7330e993b145340d Mon Sep 17 00:00:00 2001 From: suhacan Date: Thu, 10 Dec 2009 00:15:58 +0000 Subject: [PATCH] - Themes: Adding core themes package, CurrentTheme property injection, base theme/theme service interface/implementations... --HG-- extra : convert_revision : svn%3A5ff7c347-ad56-4c35-b696-ccb81de16e03/trunk%4043641 --- src/Orchard.Web/Core/Orchard.Core.csproj | 13 ++++++ .../Core/Settings/Models/SiteSettings.cs | 3 +- src/Orchard.Web/Core/Themes/AdminMenu.cs | 14 +++++++ .../Themes/Controllers/AdminController.cs | 25 ++++++++++++ .../Core/Themes/Models/ThemeSiteSettings.cs | 11 +++++ .../Themes/Models/ThemeSiteSettingsHandler.cs | 16 ++++++++ src/Orchard.Web/Core/Themes/Package.txt | 1 + .../Themes/Records/ThemeSiteSettingsRecord.cs | 7 ++++ .../Core/Themes/Services/ThemeService.cs | 40 +++++++++++++++++++ .../Themes/ViewModels/ThemesIndexViewModel.cs | 6 +++ .../Core/Themes/Views/Admin/Index.aspx | 12 ++++++ .../ThemeSiteSettingsRecord.ascx | 10 +++++ src/Orchard.Web/Core/Themes/Views/Web.config | 34 ++++++++++++++++ src/Orchard/Data/HackSessionLocator.cs | 3 -- .../Environment/DefaultCompositionStrategy.cs | 2 - src/Orchard/Orchard.csproj | 3 ++ src/Orchard/Packages/PackageManager.cs | 5 +-- src/Orchard/Themes/ITheme.cs | 10 +++++ src/Orchard/Themes/IThemeService.cs | 9 +++++ src/Orchard/Themes/ThemesModule.cs | 24 +++++++++++ 20 files changed, 238 insertions(+), 10 deletions(-) create mode 100644 src/Orchard.Web/Core/Themes/AdminMenu.cs create mode 100644 src/Orchard.Web/Core/Themes/Controllers/AdminController.cs create mode 100644 src/Orchard.Web/Core/Themes/Models/ThemeSiteSettings.cs create mode 100644 src/Orchard.Web/Core/Themes/Models/ThemeSiteSettingsHandler.cs create mode 100644 src/Orchard.Web/Core/Themes/Package.txt create mode 100644 src/Orchard.Web/Core/Themes/Records/ThemeSiteSettingsRecord.cs create mode 100644 src/Orchard.Web/Core/Themes/Services/ThemeService.cs create mode 100644 src/Orchard.Web/Core/Themes/ViewModels/ThemesIndexViewModel.cs create mode 100644 src/Orchard.Web/Core/Themes/Views/Admin/Index.aspx create mode 100644 src/Orchard.Web/Core/Themes/Views/Models/EditorTemplates/ThemeSiteSettingsRecord.ascx create mode 100644 src/Orchard.Web/Core/Themes/Views/Web.config create mode 100644 src/Orchard/Themes/ITheme.cs create mode 100644 src/Orchard/Themes/IThemeService.cs create mode 100644 src/Orchard/Themes/ThemesModule.cs diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index 9febfa794..07a957c98 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -83,6 +83,13 @@ + + + + + + + @@ -122,6 +129,12 @@ + + + + + + diff --git a/src/Orchard.Web/Core/Settings/Models/SiteSettings.cs b/src/Orchard.Web/Core/Settings/Models/SiteSettings.cs index 63aefce9e..8969cfe45 100644 --- a/src/Orchard.Web/Core/Settings/Models/SiteSettings.cs +++ b/src/Orchard.Web/Core/Settings/Models/SiteSettings.cs @@ -1,4 +1,5 @@ -using Orchard.Core.Settings.Records; +using System; +using Orchard.Core.Settings.Records; using Orchard.Models; using Orchard.Settings; diff --git a/src/Orchard.Web/Core/Themes/AdminMenu.cs b/src/Orchard.Web/Core/Themes/AdminMenu.cs new file mode 100644 index 000000000..80ddfc180 --- /dev/null +++ b/src/Orchard.Web/Core/Themes/AdminMenu.cs @@ -0,0 +1,14 @@ +using Orchard.UI.Navigation; + +namespace Orchard.Core.Themes { + public class AdminMenu : INavigationProvider { + public string MenuName { get { return "admin"; } } + + public void GetNavigation(NavigationBuilder builder) { + builder.Add("Themes", "11", + menu => menu + .Add("Manage Themes", "2.0", item => item.Action("Index", "Admin", new { area = "Themes" })) + .Add("Upload a Theme", "2.1", item => item.Action("Index", "Admin",new { area = "Themes" }))); + } + } +} diff --git a/src/Orchard.Web/Core/Themes/Controllers/AdminController.cs b/src/Orchard.Web/Core/Themes/Controllers/AdminController.cs new file mode 100644 index 000000000..406a29a8f --- /dev/null +++ b/src/Orchard.Web/Core/Themes/Controllers/AdminController.cs @@ -0,0 +1,25 @@ +using System.Web.Mvc; +using Orchard.Core.Themes.ViewModels; +using Orchard.Localization; +using Orchard.Themes; +using Orchard.UI.Notify; + +namespace Orchard.Core.Themes.Controllers { + [ValidateInput(false)] + public class AdminController : Controller { + private readonly IThemeService _themeService; + private readonly INotifier _notifier; + + public AdminController(IThemeService themeService, INotifier notifier) { + _themeService = themeService; + _notifier = notifier; + T = NullLocalizer.Instance; + } + + public Localizer T { get; set; } + + public ActionResult Index() { + return View(new ThemesIndexViewModel()); + } + } +} diff --git a/src/Orchard.Web/Core/Themes/Models/ThemeSiteSettings.cs b/src/Orchard.Web/Core/Themes/Models/ThemeSiteSettings.cs new file mode 100644 index 000000000..7a2b0fc9c --- /dev/null +++ b/src/Orchard.Web/Core/Themes/Models/ThemeSiteSettings.cs @@ -0,0 +1,11 @@ +using Orchard.Core.Themes.Records; +using Orchard.Models; + +namespace Orchard.Core.Themes.Models { + public class ThemeSiteSettings : ContentPart { + public string CurrentThemeName { + get { return Record.CurrentThemeName; } + set { Record.CurrentThemeName = value; } + } + } +} diff --git a/src/Orchard.Web/Core/Themes/Models/ThemeSiteSettingsHandler.cs b/src/Orchard.Web/Core/Themes/Models/ThemeSiteSettingsHandler.cs new file mode 100644 index 000000000..bd2e757b0 --- /dev/null +++ b/src/Orchard.Web/Core/Themes/Models/ThemeSiteSettingsHandler.cs @@ -0,0 +1,16 @@ +using Orchard.Core.Themes.Records; +using Orchard.Data; +using Orchard.Models.Driver; + +namespace Orchard.Core.Themes.Models { + public class ThemeSiteSettingsHandler : ContentHandler { + private readonly IRepository _themeSiteSettingsRepository; + + public ThemeSiteSettingsHandler(IRepository repository) { + _themeSiteSettingsRepository = repository; + Filters.Add(new ActivatingFilter("site")); + Filters.Add(new StorageFilter(_themeSiteSettingsRepository) { AutomaticallyCreateMissingRecord = true }); + Filters.Add(new TemplateFilterForRecord("ThemeSiteSettings")); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Themes/Package.txt b/src/Orchard.Web/Core/Themes/Package.txt new file mode 100644 index 000000000..aefb9b2c5 --- /dev/null +++ b/src/Orchard.Web/Core/Themes/Package.txt @@ -0,0 +1 @@ +name: Themes \ No newline at end of file diff --git a/src/Orchard.Web/Core/Themes/Records/ThemeSiteSettingsRecord.cs b/src/Orchard.Web/Core/Themes/Records/ThemeSiteSettingsRecord.cs new file mode 100644 index 000000000..c5fbe51e8 --- /dev/null +++ b/src/Orchard.Web/Core/Themes/Records/ThemeSiteSettingsRecord.cs @@ -0,0 +1,7 @@ +using Orchard.Models.Records; + +namespace Orchard.Core.Themes.Records { + public class ThemeSiteSettingsRecord : ContentPartRecord { + public virtual string CurrentThemeName { get; set; } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Themes/Services/ThemeService.cs b/src/Orchard.Web/Core/Themes/Services/ThemeService.cs new file mode 100644 index 000000000..3c82008c0 --- /dev/null +++ b/src/Orchard.Web/Core/Themes/Services/ThemeService.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; +using Orchard.Logging; +using Orchard.Models; +using Orchard.Settings; +using Orchard.Themes; +using Orchard.Core.Themes.Models; + +namespace Orchard.Core.Themes.Services { + public class ThemeService : IThemeService { + public ThemeService() { + Logger = NullLogger.Instance; + } + + public ILogger Logger { get; set; } + public ISite CurrentSite { get; set; } + + #region Implementation of IThemeService + + public ITheme GetCurrentTheme() { + string currentThemeName = CurrentSite.As().Record.CurrentThemeName; + + if (String.IsNullOrEmpty(currentThemeName)) { + return null; + } + + return GetThemeByName(currentThemeName); + } + + public ITheme GetThemeByName(string name) { + throw new NotImplementedException(); + } + + public IEnumerable GetInstalledThemes() { + throw new NotImplementedException(); + } + + #endregion + } +} diff --git a/src/Orchard.Web/Core/Themes/ViewModels/ThemesIndexViewModel.cs b/src/Orchard.Web/Core/Themes/ViewModels/ThemesIndexViewModel.cs new file mode 100644 index 000000000..1ecf8514f --- /dev/null +++ b/src/Orchard.Web/Core/Themes/ViewModels/ThemesIndexViewModel.cs @@ -0,0 +1,6 @@ +using Orchard.Mvc.ViewModels; + +namespace Orchard.Core.Themes.ViewModels { + public class ThemesIndexViewModel : AdminViewModel { + } +} diff --git a/src/Orchard.Web/Core/Themes/Views/Admin/Index.aspx b/src/Orchard.Web/Core/Themes/Views/Admin/Index.aspx new file mode 100644 index 000000000..5e0dd8df4 --- /dev/null +++ b/src/Orchard.Web/Core/Themes/Views/Admin/Index.aspx @@ -0,0 +1,12 @@ +<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage" %> +<%@ Import Namespace="Orchard.Core.Themes.ViewModels"%> +<%@ Import Namespace="Orchard.Mvc.Html"%> +<% Html.Include("AdminHead"); %> +
+

+ Themes

+
+
+ List of Orchard Themes +
+<% Html.Include("AdminFoot"); %> \ No newline at end of file diff --git a/src/Orchard.Web/Core/Themes/Views/Models/EditorTemplates/ThemeSiteSettingsRecord.ascx b/src/Orchard.Web/Core/Themes/Views/Models/EditorTemplates/ThemeSiteSettingsRecord.ascx new file mode 100644 index 000000000..19029941a --- /dev/null +++ b/src/Orchard.Web/Core/Themes/Views/Models/EditorTemplates/ThemeSiteSettingsRecord.ascx @@ -0,0 +1,10 @@ +<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> +<%@ Import Namespace="Orchard.Core.Themes.Records"%> +

Themes

+
    +
  1. + <%= Html.LabelFor(x=>x.CurrentThemeName) %> + <%= Html.EditorFor(x=>x.CurrentThemeName) %> + <%= Html.ValidationMessage("CurrentThemeName", "*")%> +
  2. +
diff --git a/src/Orchard.Web/Core/Themes/Views/Web.config b/src/Orchard.Web/Core/Themes/Views/Web.config new file mode 100644 index 000000000..7022197d4 --- /dev/null +++ b/src/Orchard.Web/Core/Themes/Views/Web.config @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Orchard/Data/HackSessionLocator.cs b/src/Orchard/Data/HackSessionLocator.cs index 6db6b116e..dad642adf 100644 --- a/src/Orchard/Data/HackSessionLocator.cs +++ b/src/Orchard/Data/HackSessionLocator.cs @@ -1,9 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; -using System.Reflection; using System.Threading; -using System.Web; using System.Web.Hosting; using FluentNHibernate.Automapping; using FluentNHibernate.Automapping.Alterations; @@ -12,7 +10,6 @@ using FluentNHibernate.Cfg.Db; using NHibernate; using NHibernate.Tool.hbm2ddl; using Orchard.Environment; -using Orchard.Models; using Orchard.Models.Records; namespace Orchard.Data { diff --git a/src/Orchard/Environment/DefaultCompositionStrategy.cs b/src/Orchard/Environment/DefaultCompositionStrategy.cs index 92880674d..19ba083b4 100644 --- a/src/Orchard/Environment/DefaultCompositionStrategy.cs +++ b/src/Orchard/Environment/DefaultCompositionStrategy.cs @@ -2,8 +2,6 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; -using System.Text; -using System.Web.Compilation; using Autofac; using Orchard.Models; using Orchard.Models.Records; diff --git a/src/Orchard/Orchard.csproj b/src/Orchard/Orchard.csproj index 603421b57..a8fbe8e62 100644 --- a/src/Orchard/Orchard.csproj +++ b/src/Orchard/Orchard.csproj @@ -214,6 +214,9 @@ + + + diff --git a/src/Orchard/Packages/PackageManager.cs b/src/Orchard/Packages/PackageManager.cs index 56a6a9c2e..29d4f76a3 100644 --- a/src/Orchard/Packages/PackageManager.cs +++ b/src/Orchard/Packages/PackageManager.cs @@ -1,8 +1,5 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; -using System.Reflection; -using System.Text; using Orchard.Packages.Loaders; using Yaml.Grammar; diff --git a/src/Orchard/Themes/ITheme.cs b/src/Orchard/Themes/ITheme.cs new file mode 100644 index 000000000..5f2174931 --- /dev/null +++ b/src/Orchard/Themes/ITheme.cs @@ -0,0 +1,10 @@ +using Orchard.Models; + +namespace Orchard.Themes { + /// + /// Interface provided by the "themes" model. + /// + public interface ITheme : IContent { + string ThemeName { get; set; } + } +} diff --git a/src/Orchard/Themes/IThemeService.cs b/src/Orchard/Themes/IThemeService.cs new file mode 100644 index 000000000..c9abc5958 --- /dev/null +++ b/src/Orchard/Themes/IThemeService.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Orchard.Themes { + public interface IThemeService : IDependency { + ITheme GetCurrentTheme(); + ITheme GetThemeByName(string themeName); + IEnumerable GetInstalledThemes(); + } +} diff --git a/src/Orchard/Themes/ThemesModule.cs b/src/Orchard/Themes/ThemesModule.cs new file mode 100644 index 000000000..30af82ba1 --- /dev/null +++ b/src/Orchard/Themes/ThemesModule.cs @@ -0,0 +1,24 @@ +using System; +using System.Reflection; +using Module = Autofac.Builder.Module; + +namespace Orchard.Themes { + public class ThemesModule : Module { + protected override void AttachToComponentRegistration(Autofac.IContainer container, Autofac.IComponentRegistration registration) { + + var themeProperty = FindThemeProperty(registration.Descriptor.BestKnownImplementationType); + + if (themeProperty != null) { + registration.Activated += (sender, e) => { + var themeService = e.Context.Resolve(); + var currentTheme = themeService.GetCurrentTheme(); + themeProperty.SetValue(e.Instance, currentTheme, null); + }; + } + } + + private static PropertyInfo FindThemeProperty(Type type) { + return type.GetProperty("CurrentTheme", typeof(ITheme)); + } + } +}