From f7b77808fc865f1d2d9ea83615c770162e1a2d0f Mon Sep 17 00:00:00 2001 From: Nathan Heskew Date: Tue, 12 Oct 2010 13:53:17 -0700 Subject: [PATCH] Adding a rudimentary recent blog posts widget --HG-- branch : dev --- .../Drivers/RecentBlogPostsPartDriver.cs | 62 +++++++++++++++++++ .../Handlers/RecentBlogPostsPartHandler.cs | 13 ++++ .../Modules/Orchard.Blogs/Migrations.cs | 17 +++++ .../Models/RecentBlogPostsPart.cs | 17 +++++ .../Models/RecentBlogPostsPartRecord.cs | 8 +++ .../Orchard.Blogs/Orchard.Blogs.csproj | 5 ++ .../Parts/Blogs.RecentBlogPosts.cshtml | 11 ++++ .../TheThemeMachine/Views/Layout.cshtml | 11 +++- 8 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 src/Orchard.Web/Modules/Orchard.Blogs/Drivers/RecentBlogPostsPartDriver.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Blogs/Handlers/RecentBlogPostsPartHandler.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Blogs/Models/RecentBlogPostsPart.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Blogs/Models/RecentBlogPostsPartRecord.cs create mode 100644 src/Orchard.Web/Modules/Orchard.Blogs/Views/EditorTemplates/Parts/Blogs.RecentBlogPosts.cshtml diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/RecentBlogPostsPartDriver.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/RecentBlogPostsPartDriver.cs new file mode 100644 index 000000000..ed5cb1adf --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Drivers/RecentBlogPostsPartDriver.cs @@ -0,0 +1,62 @@ +using System.Collections.Generic; +using System.Linq; +using Orchard.Blogs.Models; +using Orchard.Blogs.Services; +using Orchard.ContentManagement; +using Orchard.ContentManagement.Drivers; +using Orchard.Core.Common.Models; +using Orchard.Core.ContentsLocation.Models; + +namespace Orchard.Blogs.Drivers { + public class RecentBlogPostsPartDriver : ContentPartDriver { + private readonly IBlogService _blogService; + private readonly IContentManager _contentManager; + + public RecentBlogPostsPartDriver(IBlogService blogService, IContentManager contentManager) { + _blogService = blogService; + _contentManager = contentManager; + } + + protected override DriverResult Display(RecentBlogPostsPart part, string displayType, dynamic shapeHelper) { + IEnumerable blogPosts = null; + + BlogPart blog = null; + if (!string.IsNullOrWhiteSpace(part.ForBlog)) + blog = _blogService.Get(part.ForBlog); + + if (blog != null) { + blogPosts = _contentManager.Query(VersionOptions.Published, "BlogPost") + .Join().Where(cr => cr.Container == blog.Record.ContentItemRecord) + .OrderByDescending(cr => cr.CreatedUtc) + .Slice(0, part.Count) + .Select(ci => ci.As()); + } + else { + var blogs = _blogService.Get().ToList(); + blogPosts = _contentManager.Query(VersionOptions.Published, "BlogPost") + .Join() + .OrderByDescending(cr => cr.CreatedUtc) + .Slice(0, part.Count) + .Select(ci => ci.As()); + } + + var list = shapeHelper.List(); + list.AddRange(blogPosts.Select(bp => _contentManager.BuildDisplay(bp, "Summary.BlogPost"))); + + var blogPostList = shapeHelper.Parts_Blogs_BlogPost_List(ContentPart: part, BlogPosts: list); + blogPostList.Metadata.Type = "Parts_Blogs_BlogPost.List"; + + return ContentShape(blogPostList).Location("Primary"); + } + + protected override DriverResult Editor(RecentBlogPostsPart part, dynamic shapeHelper) { + var location = part.GetLocation("Editor", "Primary", "5"); + return ContentPartTemplate(part, "Parts/Blogs.RecentBlogPosts").Location(location); + } + + protected override DriverResult Editor(RecentBlogPostsPart part, IUpdateModel updater, dynamic shapeHelper) { + updater.TryUpdateModel(part, Prefix, null, null); + return Editor(part, shapeHelper); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Handlers/RecentBlogPostsPartHandler.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Handlers/RecentBlogPostsPartHandler.cs new file mode 100644 index 000000000..eb3a68339 --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Handlers/RecentBlogPostsPartHandler.cs @@ -0,0 +1,13 @@ +using JetBrains.Annotations; +using Orchard.Blogs.Models; +using Orchard.ContentManagement.Handlers; +using Orchard.Data; + +namespace Orchard.Blogs.Handlers { + [UsedImplicitly] + public class RecentBlogPostsPartHandler : ContentHandler { + public RecentBlogPostsPartHandler(IRepository repository) { + Filters.Add(StorageFilter.For(repository)); + } + } +} \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Migrations.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Migrations.cs index ff500e5c7..8621868b1 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Migrations.cs +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Migrations.cs @@ -55,5 +55,22 @@ namespace Orchard.Blogs { })); return 3; } + + public int UpdateFrom3() { + SchemaBuilder.CreateTable("RecentBlogPostsPartRecord", table => table + .ContentPartRecord() + .Column("BlogSlug") + .Column("Count") + ); + + ContentDefinitionManager.AlterTypeDefinition("RecentBlogPosts", + cfg => cfg + .WithPart("RecentBlogPostsPart") + .WithPart("CommonPart") + .WithPart("WidgetPart") + .WithSetting("Stereotype", "Widget") + ); + return 4; + } } } \ No newline at end of file diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Models/RecentBlogPostsPart.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Models/RecentBlogPostsPart.cs new file mode 100644 index 000000000..485cebe9e --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Models/RecentBlogPostsPart.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; +using Orchard.ContentManagement; + +namespace Orchard.Blogs.Models { + public class RecentBlogPostsPart : ContentPart { + public string ForBlog { + get { return Record.BlogSlug; } + set { Record.BlogSlug = value; } + } + + [Required] + public int Count { + get { return Record.Count; } + set { Record.Count = value; } + } + } +} diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Models/RecentBlogPostsPartRecord.cs b/src/Orchard.Web/Modules/Orchard.Blogs/Models/RecentBlogPostsPartRecord.cs new file mode 100644 index 000000000..0d892792a --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Models/RecentBlogPostsPartRecord.cs @@ -0,0 +1,8 @@ +using Orchard.ContentManagement.Records; + +namespace Orchard.Blogs.Models { + public class RecentBlogPostsPartRecord : ContentPartRecord { + public virtual string BlogSlug { get; set; } + public virtual int Count { get; set; } + } +} diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Orchard.Blogs.csproj b/src/Orchard.Web/Modules/Orchard.Blogs/Orchard.Blogs.csproj index d4dce537d..dc531ace0 100644 --- a/src/Orchard.Web/Modules/Orchard.Blogs/Orchard.Blogs.csproj +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Orchard.Blogs.csproj @@ -67,6 +67,10 @@ + + + + @@ -183,6 +187,7 @@ + diff --git a/src/Orchard.Web/Modules/Orchard.Blogs/Views/EditorTemplates/Parts/Blogs.RecentBlogPosts.cshtml b/src/Orchard.Web/Modules/Orchard.Blogs/Views/EditorTemplates/Parts/Blogs.RecentBlogPosts.cshtml new file mode 100644 index 000000000..e8cf87dda --- /dev/null +++ b/src/Orchard.Web/Modules/Orchard.Blogs/Views/EditorTemplates/Parts/Blogs.RecentBlogPosts.cshtml @@ -0,0 +1,11 @@ +@model Orchard.Blogs.Models.RecentBlogPostsPart +
+
+ @Html.LabelFor(m => m.ForBlog) + @Html.TextBoxFor(m => m.ForBlog) +
+
+ @Html.LabelFor(m => m.Count) + @Html.TextBoxFor(m => m.Count) +
+
\ No newline at end of file diff --git a/src/Orchard.Web/Themes/TheThemeMachine/Views/Layout.cshtml b/src/Orchard.Web/Themes/TheThemeMachine/Views/Layout.cshtml index 20f266501..5f6d4f961 100644 --- a/src/Orchard.Web/Themes/TheThemeMachine/Views/Layout.cshtml +++ b/src/Orchard.Web/Themes/TheThemeMachine/Views/Layout.cshtml @@ -61,7 +61,16 @@ @Zone(Model.Messages) } - + @if(Model.Featured != null) { + + } + @if(Model.Recent != null) { +
+ @Zone(Model.Recent) +
+ } @if(Model.Sidebar2 != null) {