diff --git a/src/Orchard.Web/Core/HomePage/Controllers/HomeController.cs b/src/Orchard.Web/Core/HomePage/Controllers/HomeController.cs new file mode 100644 index 000000000..000d3e1fc --- /dev/null +++ b/src/Orchard.Web/Core/HomePage/Controllers/HomeController.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Generic; +using System.Web.Mvc; +using JetBrains.Annotations; +using Orchard.Logging; +using Orchard.Mvc.ViewModels; +using Orchard.Services; +using Orchard.Settings; + +namespace Orchard.Core.HomePage.Controllers { + [HandleError] + public class HomeController : Controller { + private readonly IEnumerable _homePageProviders; + + public HomeController(IEnumerable homePageProviders) { + _homePageProviders = homePageProviders; + Logger = NullLogger.Instance; + } + + public ILogger Logger { get; set; } + protected virtual ISite CurrentSite { get; [UsedImplicitly] private set; } + + public ActionResult Index() { + try { + string homepage = CurrentSite.HomePage; + if (String.IsNullOrEmpty(homepage)) { + return View(new BaseViewModel()); + } + + string[] homePageParameters = homepage.Split(';'); + if (homePageParameters.Length != 2) { + return View(new BaseViewModel()); + } + string providerName = homePageParameters[0]; + int item = Int32.Parse(homePageParameters[1]); + + foreach (var provider in _homePageProviders) { + if (String.Equals(provider.GetProviderName(), providerName)) { + ActionResult result = provider.GetHomePage(item); + if (result is ViewResultBase) { + ViewResultBase resultBase = result as ViewResultBase; + ViewData = resultBase.ViewData; + } + return result; + } + } + + return View(new BaseViewModel()); + } + catch { + return View(new BaseViewModel()); + } + } + } + +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/HomePage/Module.txt b/src/Orchard.Web/Core/HomePage/Module.txt new file mode 100644 index 000000000..aa81b4985 --- /dev/null +++ b/src/Orchard.Web/Core/HomePage/Module.txt @@ -0,0 +1 @@ +name: HomePage diff --git a/src/Orchard.Web/Core/HomePage/Routes.cs b/src/Orchard.Web/Core/HomePage/Routes.cs new file mode 100644 index 000000000..2935980fd --- /dev/null +++ b/src/Orchard.Web/Core/HomePage/Routes.cs @@ -0,0 +1,36 @@ +using System.Collections.Generic; +using System.Web.Mvc; +using System.Web.Routing; +using Orchard.Mvc.Routes; + +namespace Orchard.Core.HomePage { + public class Routes : IRouteProvider { + public void GetRoutes(ICollection routes) { + foreach (var routeDescriptor in GetRoutes()) + routes.Add(routeDescriptor); + } + + public IEnumerable GetRoutes() { + return new[] { + new RouteDescriptor { + Priority = 20, + Route = new Route( + "", + new RouteValueDictionary { + {"area", "HomePage"}, + {"controller", "Home"}, + {"action", "Index"} + }, + new RouteValueDictionary { + {"area", "HomePage"}, + {"controller", "Home"}, + }, + new RouteValueDictionary { + {"area", "HomePage"} + }, + new MvcRouteHandler()) + } + }; + } + } +} diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index 1420691a6..eb8002ed9 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -102,6 +102,8 @@ + + @@ -216,6 +218,7 @@ + diff --git a/src/Orchard.Web/Core/Settings/Models/SiteSettings.cs b/src/Orchard.Web/Core/Settings/Models/SiteSettings.cs index 80d0509c8..1283ffcbe 100644 --- a/src/Orchard.Web/Core/Settings/Models/SiteSettings.cs +++ b/src/Orchard.Web/Core/Settings/Models/SiteSettings.cs @@ -24,5 +24,9 @@ namespace Orchard.Core.Settings.Models { get { return Record.SuperUser; } set { Record.SuperUser = value; } } + public string HomePage { + get { return Record.HomePage; } + set { Record.HomePage = value; } + } } } diff --git a/src/Orchard.Web/Core/Settings/Records/SiteSettingsRecord.cs b/src/Orchard.Web/Core/Settings/Records/SiteSettingsRecord.cs index 6a0e85af4..03cb74ba5 100644 --- a/src/Orchard.Web/Core/Settings/Records/SiteSettingsRecord.cs +++ b/src/Orchard.Web/Core/Settings/Records/SiteSettingsRecord.cs @@ -7,5 +7,6 @@ namespace Orchard.Core.Settings.Records { public virtual string SiteName { get; set; } public virtual string SuperUser { get; set; } public virtual string PageTitleSeparator { get; set; } + public virtual string HomePage { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Pages/Controllers/AdminController.cs b/src/Orchard.Web/Modules/Orchard.Pages/Controllers/AdminController.cs index 613fbfb0c..098167a90 100644 --- a/src/Orchard.Web/Modules/Orchard.Pages/Controllers/AdminController.cs +++ b/src/Orchard.Web/Modules/Orchard.Pages/Controllers/AdminController.cs @@ -3,12 +3,14 @@ using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Web.Mvc; +using JetBrains.Annotations; using Orchard.Localization; using Orchard.ContentManagement; using Orchard.Mvc.Results; using Orchard.Pages.Models; using Orchard.Pages.Services; using Orchard.Pages.ViewModels; +using Orchard.Settings; using Orchard.UI.Notify; namespace Orchard.Pages.Controllers { @@ -22,6 +24,7 @@ namespace Orchard.Pages.Controllers { T = NullLocalizer.Instance; } + protected virtual ISite CurrentSite { get; [UsedImplicitly] private set; } public IOrchardServices Services { get; private set; } private Localizer T { get; set; } @@ -189,6 +192,9 @@ namespace Orchard.Pages.Controllers { case "PublishNow": _pageService.Publish(model.Page.Item); Services.Notifier.Information(T("Page has been published")); + if (model.PromoteToHomePage) { + CurrentSite.HomePage = "PagesHomePageProvider;" + model.Page.Item.Id; + } break; case "PublishLater": _pageService.Publish(model.Page.Item, model.Page.Item.ScheduledPublishUtc.Value); diff --git a/src/Orchard.Web/Modules/Orchard.Pages/Orchard.Pages.csproj b/src/Orchard.Web/Modules/Orchard.Pages/Orchard.Pages.csproj index 4f3fc268a..be6647bda 100644 --- a/src/Orchard.Web/Modules/Orchard.Pages/Orchard.Pages.csproj +++ b/src/Orchard.Web/Modules/Orchard.Pages/Orchard.Pages.csproj @@ -77,6 +77,7 @@ + Code diff --git a/src/Orchard.Web/Modules/Orchard.Pages/Services/PagesHomePageProvider.cs b/src/Orchard.Web/Modules/Orchard.Pages/Services/PagesHomePageProvider.cs new file mode 100644 index 000000000..7f13ccfa1 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Pages/Services/PagesHomePageProvider.cs @@ -0,0 +1,51 @@ +using System.Web.Mvc; +using Orchard.Localization; +using Orchard.Mvc.Results; +using Orchard.Pages.Models; +using Orchard.Pages.ViewModels; +using Orchard.Services; + +namespace Orchard.Pages.Services { + public class PagesHomePageProvider : IHomePageProvider { + private readonly IPageService _pageService; + private readonly ISlugConstraint _slugConstraint; + + public PagesHomePageProvider(IOrchardServices services, IPageService pageService, ISlugConstraint slugConstraint) { + Services = services; + _slugConstraint = slugConstraint; + _pageService = pageService; + T = NullLocalizer.Instance; + } + + public IOrchardServices Services { get; private set; } + private Localizer T { get; set; } + + #region Implementation of IHomePageProvider + + public string GetProviderName() { + return "PagesHomePageProvider"; + } + + public ActionResult GetHomePage(int itemId) { + Page page = _pageService.Get(itemId); + var correctedSlug = _slugConstraint.LookupPublishedSlug(page.Slug); + if (correctedSlug == null) + return new NotFoundResult(); + + page = _pageService.Get(correctedSlug); + if (page == null) + return new NotFoundResult(); + + var model = new PageViewModel { + Page = Services.ContentManager.BuildDisplayModel(page, "Detail") + }; + + return new ViewResult { + ViewName = "~/Modules/Orchard.Pages/Views/Page/Item.ascx", + ViewData = new ViewDataDictionary(model) + }; + } + + #endregion + } +} diff --git a/src/Orchard.Web/Modules/Orchard.Pages/ViewModels/PageEditViewModel.cs b/src/Orchard.Web/Modules/Orchard.Pages/ViewModels/PageEditViewModel.cs index 93a2b315e..f0aa77b6d 100644 --- a/src/Orchard.Web/Modules/Orchard.Pages/ViewModels/PageEditViewModel.cs +++ b/src/Orchard.Web/Modules/Orchard.Pages/ViewModels/PageEditViewModel.cs @@ -4,5 +4,6 @@ using Orchard.Mvc.ViewModels; namespace Orchard.Pages.ViewModels { public class PageEditViewModel : AdminViewModel { public ContentItemViewModel Page { get; set; } + public bool PromoteToHomePage { get; set; } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Pages/Views/Admin/Edit.ascx b/src/Orchard.Web/Modules/Orchard.Pages/Views/Admin/Edit.ascx index 7fd90d4ed..353d83fa8 100644 --- a/src/Orchard.Web/Modules/Orchard.Pages/Views/Admin/Edit.ascx +++ b/src/Orchard.Web/Modules/Orchard.Pages/Views/Admin/Edit.ascx @@ -4,5 +4,8 @@

<%=Html.TitleForPage(T("Edit Page").ToString()) %>

<% using (Html.BeginFormAntiForgeryPost()) { %> <%=Html.ValidationSummary() %> - <%=Html.EditorForItem(m => m.Page) %><% + <%=Html.EditorForItem(m => m.Page) %> + <%=Html.EditorFor(m => m.PromoteToHomePage) %> + + <% } %> \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Pages/Views/Page/Item.ascx b/src/Orchard.Web/Modules/Orchard.Pages/Views/Page/Item.ascx index 2e9c113fc..aa21b0278 100644 --- a/src/Orchard.Web/Modules/Orchard.Pages/Views/Page/Item.ascx +++ b/src/Orchard.Web/Modules/Orchard.Pages/Views/Page/Item.ascx @@ -1,4 +1,4 @@ <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> <%@ Import Namespace="Orchard.Mvc.Html"%> <%@ Import Namespace="Orchard.Pages.ViewModels"%> -<%=Html.DisplayForItem(m=>m.Page) %> \ No newline at end of file +<%=Html.DisplayForItem(m=>m.Page) %> diff --git a/src/Orchard.Web/Modules/Orchard.Setup/Controllers/SetupController.cs b/src/Orchard.Web/Modules/Orchard.Setup/Controllers/SetupController.cs index 8d1bf1150..a67226077 100644 --- a/src/Orchard.Web/Modules/Orchard.Setup/Controllers/SetupController.cs +++ b/src/Orchard.Web/Modules/Orchard.Setup/Controllers/SetupController.cs @@ -14,7 +14,6 @@ using Orchard.Security; using Orchard.Settings; using Orchard.Setup.ViewModels; using Orchard.Localization; -using Orchard.UI.Navigation; using Orchard.UI.Notify; using MenuItem=Orchard.Core.Navigation.Models.MenuItem; @@ -104,6 +103,7 @@ namespace Orchard.Setup.Controllers { page.As().CommentsShown = false; page.As().Owner = user; contentManager.Publish(page); + siteSettings.Record.HomePage = "PagesHomePageProvider;" + page.Id; // add a menu item for the shiny new home page var menuItem = contentManager.Create("menuitem"); diff --git a/src/Orchard/Environment/ShellBuilders/SafeModeShellContainerFactory.cs b/src/Orchard/Environment/ShellBuilders/SafeModeShellContainerFactory.cs index 64db3b7da..91eee9bae 100644 --- a/src/Orchard/Environment/ShellBuilders/SafeModeShellContainerFactory.cs +++ b/src/Orchard/Environment/ShellBuilders/SafeModeShellContainerFactory.cs @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Web; @@ -161,6 +162,11 @@ namespace Orchard.Environment.ShellBuilders { public string SuperUser { get { return ""; } } + + public string HomePage { + get { return ""; } + set { throw new NotImplementedException(); } + } } } diff --git a/src/Orchard/Orchard.csproj b/src/Orchard/Orchard.csproj index 1381fd4d1..2383f12e1 100644 --- a/src/Orchard/Orchard.csproj +++ b/src/Orchard/Orchard.csproj @@ -154,6 +154,7 @@ + diff --git a/src/Orchard/Services/IHomePageProvider.cs b/src/Orchard/Services/IHomePageProvider.cs new file mode 100644 index 000000000..dfe185f3c --- /dev/null +++ b/src/Orchard/Services/IHomePageProvider.cs @@ -0,0 +1,8 @@ +using System.Web.Mvc; + +namespace Orchard.Services { + public interface IHomePageProvider : IDependency { + string GetProviderName(); + ActionResult GetHomePage(int itemId); + } +} diff --git a/src/Orchard/Settings/ISite.cs b/src/Orchard/Settings/ISite.cs index 17c9a7465..63a37c10c 100644 --- a/src/Orchard/Settings/ISite.cs +++ b/src/Orchard/Settings/ISite.cs @@ -10,5 +10,6 @@ namespace Orchard.Settings { string SiteSalt { get; } string SiteUrl { get; } string SuperUser { get; } + string HomePage { get; set; } } }