From feeabef4792c3a8493b4c1c694f7276d9488e8d7 Mon Sep 17 00:00:00 2001 From: Sebastien Ros Date: Thu, 11 Oct 2012 18:17:10 -0700 Subject: [PATCH] #19084: Handling publishing/unpublishing event for Content Menu Items When a content item is removed, its menu items are also. When a content item is unpublished, its menu items are also. When a content item is published, its menu items are also. Work Item: 19084 --HG-- branch : 1.x --- .../Handlers/NavigationPartHandler.cs | 65 +++++++++++++++++++ src/Orchard.Web/Core/Orchard.Core.csproj | 5 ++ 2 files changed, 70 insertions(+) create mode 100644 src/Orchard.Web/Core/Navigation/Handlers/NavigationPartHandler.cs diff --git a/src/Orchard.Web/Core/Navigation/Handlers/NavigationPartHandler.cs b/src/Orchard.Web/Core/Navigation/Handlers/NavigationPartHandler.cs new file mode 100644 index 000000000..88d454cff --- /dev/null +++ b/src/Orchard.Web/Core/Navigation/Handlers/NavigationPartHandler.cs @@ -0,0 +1,65 @@ +using JetBrains.Annotations; +using Orchard.ContentManagement; +using Orchard.Core.Navigation.Models; +using Orchard.Data; +using Orchard.ContentManagement.Handlers; + +namespace Orchard.Core.Navigation.Handlers { + [UsedImplicitly] + public class NavigationPartHandler : ContentHandler { + private readonly IContentManager _contentManager; + private readonly IRepository _repository; + + public NavigationPartHandler(IContentManager contentManager, IRepository repository) { + _contentManager = contentManager; + _repository = repository; + + OnRemoving((context, part) => RemoveContentItems(part)); + + OnUnpublished((context, part) => UnpublishContentItems(part)); + OnPublished((context, part) => PublishContentItems(part)); + } + + public void RemoveContentItems(NavigationPart part) { + // look for ContentMenuItemPart with this content + var contentMenuItemRecords = _repository.Fetch(x => x.ContentMenuItemRecord == part.ContentItem.Record); + + // delete all menu items linking to this content item + foreach (var contentMenuItemRecord in contentMenuItemRecords) { + // look for any version + var contentItem = _contentManager.Get(contentMenuItemRecord.Id, VersionOptions.AllVersions); + if (contentItem != null) { + _contentManager.Remove(contentItem); + } + } + } + + public void UnpublishContentItems(NavigationPart part) { + // look for ContentMenuItemPart with this content + var contentMenuItemRecords = _repository.Fetch(x => x.ContentMenuItemRecord == part.ContentItem.Record); + + // delete all menu items linking to this content item + foreach (var contentMenuItemRecord in contentMenuItemRecords) { + // look for a published version only + var contentItem = _contentManager.Get(contentMenuItemRecord.Id); + if (contentItem != null) { + _contentManager.Unpublish(contentItem); + } + } + } + + public void PublishContentItems(NavigationPart part) { + // look for ContentMenuItemPart with this content + var contentMenuItemRecords = _repository.Fetch(x => x.ContentMenuItemRecord == part.ContentItem.Record); + + // delete all menu items linking to this content item + foreach (var contentMenuItemRecord in contentMenuItemRecords) { + // even look for an unpublished version + var contentItem = _contentManager.Get(contentMenuItemRecord.Id, VersionOptions.Latest); + if(contentItem != null) { + _contentManager.Publish(contentItem); + } + } + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Core/Orchard.Core.csproj b/src/Orchard.Web/Core/Orchard.Core.csproj index 7a08a7465..c0b0f0b24 100644 --- a/src/Orchard.Web/Core/Orchard.Core.csproj +++ b/src/Orchard.Web/Core/Orchard.Core.csproj @@ -21,6 +21,10 @@ false + + + + true @@ -138,6 +142,7 @@ +