#:18064 Blog post archive widget does not work when blog is the home page

Work Item: 18064

--HG--
branch : 1.x
This commit is contained in:
Sebastien Ros
2011-09-21 15:01:44 -07:00
parent 0617550b74
commit 0512f4cb78
8 changed files with 38 additions and 22 deletions

View File

@@ -6,27 +6,28 @@ using Orchard.Blogs.ViewModels;
using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers;
using Orchard.Core.Routable.Models;
namespace Orchard.Blogs.Drivers {
public class BlogArchivesPartDriver : ContentPartDriver<BlogArchivesPart> {
private readonly IBlogService _blogService;
private readonly IBlogPostService _blogPostService;
private readonly IContentManager _contentManager;
private readonly IBlogPathConstraint _blogPathConstraint;
public BlogArchivesPartDriver(
IBlogService blogService,
IBlogPostService blogPostService,
IBlogPathConstraint blogPathConstraint) {
IContentManager contentManager) {
_blogService = blogService;
_blogPostService = blogPostService;
_blogPathConstraint = blogPathConstraint;
_contentManager = contentManager;
}
protected override DriverResult Display(BlogArchivesPart part, string displayType, dynamic shapeHelper) {
return ContentShape("Parts_Blogs_BlogArchives",
() => {
var path = _blogPathConstraint.FindPath(part.ForBlog);
BlogPart blog = _blogService.Get(path);
BlogPart blog = GetBlogFromSlug(part.ForBlog);
if (blog == null)
return null;
@@ -37,7 +38,7 @@ namespace Orchard.Blogs.Drivers {
protected override DriverResult Editor(BlogArchivesPart part, dynamic shapeHelper) {
var viewModel = new BlogArchivesViewModel {
Path = part.ForBlog,
Slug = part.ForBlog,
Blogs = _blogService.Get().ToList().OrderBy(b => b.Name)
};
@@ -48,7 +49,7 @@ namespace Orchard.Blogs.Drivers {
protected override DriverResult Editor(BlogArchivesPart part, IUpdateModel updater, dynamic shapeHelper) {
var viewModel = new BlogArchivesViewModel();
if (updater.TryUpdateModel(viewModel, Prefix, null, null)) {
part.ForBlog = viewModel.Path;
part.ForBlog = viewModel.Slug;
}
return Editor(part, shapeHelper);
@@ -64,5 +65,11 @@ namespace Orchard.Blogs.Drivers {
protected override void Exporting(BlogArchivesPart part, ExportContentContext context) {
context.Element(part.PartDefinition.Name).SetAttributeValue("BlogSlug", part.ForBlog);
}
private BlogPart GetBlogFromSlug(string slug) {
return _contentManager.Query<BlogPart, BlogPartRecord>()
.Join<RoutePartRecord>().Where(rr => rr.Slug == slug)
.List().FirstOrDefault();
}
}
}

View File

@@ -8,25 +8,22 @@ using Orchard.ContentManagement;
using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers;
using Orchard.Core.Common.Models;
using Orchard.Core.Routable.Models;
namespace Orchard.Blogs.Drivers {
public class RecentBlogPostsPartDriver : ContentPartDriver<RecentBlogPostsPart> {
private readonly IBlogService _blogService;
private readonly IContentManager _contentManager;
private readonly IBlogPathConstraint _blogPathConstraint;
public RecentBlogPostsPartDriver(
IBlogService blogService,
IContentManager contentManager,
IBlogPathConstraint blogPathConstraint) {
IContentManager contentManager) {
_blogService = blogService;
_contentManager = contentManager;
_blogPathConstraint = blogPathConstraint;
}
protected override DriverResult Display(RecentBlogPostsPart part, string displayType, dynamic shapeHelper) {
var path = _blogPathConstraint.FindPath(part.ForBlog);
BlogPart blog = _blogService.Get(path);
BlogPart blog = GetBlogFromSlug(part.ForBlog);
if (blog == null) {
return null;
@@ -49,7 +46,7 @@ namespace Orchard.Blogs.Drivers {
protected override DriverResult Editor(RecentBlogPostsPart part, dynamic shapeHelper) {
var viewModel = new RecentBlogPostsViewModel {
Count = part.Count,
Path = part.ForBlog,
Slug = part.ForBlog,
Blogs = _blogService.Get().ToList().OrderBy(b => b.Name)
};
@@ -60,7 +57,7 @@ namespace Orchard.Blogs.Drivers {
protected override DriverResult Editor(RecentBlogPostsPart part, IUpdateModel updater, dynamic shapeHelper) {
var viewModel = new RecentBlogPostsViewModel();
if (updater.TryUpdateModel(viewModel, Prefix, null, null)) {
part.ForBlog = viewModel.Path;
part.ForBlog = viewModel.Slug;
part.Count = viewModel.Count;
}
@@ -83,5 +80,11 @@ namespace Orchard.Blogs.Drivers {
context.Element(part.PartDefinition.Name).SetAttributeValue("BlogSlug", part.ForBlog);
context.Element(part.PartDefinition.Name).SetAttributeValue("Count", part.Count);
}
private BlogPart GetBlogFromSlug(string slug) {
return _contentManager.Query<BlogPart, BlogPartRecord>()
.Join<RoutePartRecord>().Where(rr => rr.Slug == slug)
.List().FirstOrDefault();
}
}
}

View File

@@ -3,6 +3,7 @@ using Orchard.ContentManagement;
namespace Orchard.Blogs.Models {
public class RecentBlogPostsPart : ContentPart<RecentBlogPostsPartRecord> {
public string ForBlog {
get { return Record.BlogSlug; }
set { Record.BlogSlug = value; }

View File

@@ -2,6 +2,10 @@
namespace Orchard.Blogs.Models {
public class RecentBlogPostsPartRecord : ContentPartRecord {
public RecentBlogPostsPartRecord() {
Count = 5;
}
public virtual string BlogSlug { get; set; }
public virtual int Count { get; set; }
}

View File

@@ -3,7 +3,7 @@ using Orchard.Blogs.Models;
namespace Orchard.Blogs.ViewModels {
public class BlogArchivesViewModel {
public string Path { get; set; }
public string Slug { get; set; }
public IEnumerable<BlogPart> Blogs { get; set; }
}
}

View File

@@ -4,7 +4,7 @@ using Orchard.Blogs.Models;
namespace Orchard.Blogs.ViewModels {
public class RecentBlogPostsViewModel {
public int Count { get; set; }
public string Path { get; set; }
public string Slug { get; set; }
public IEnumerable<BlogPart> Blogs { get; set; }
}
}

View File

@@ -6,8 +6,8 @@
<fieldset>
<div>
@Html.LabelFor(m => m.Path, T("For Blog"))
<select id="@Html.FieldIdFor(m => m.Path)" name="@Html.FieldNameFor(m => m.Path)">
@Html.LabelFor(m => m.Slug, T("For Blog"))
<select id="@Html.FieldIdFor(m => m.Slug)" name="@Html.FieldNameFor(m => m.Slug)">
@foreach(BlogPart blog in Model.Blogs) {
@Html.SelectOption(Model.Path, blog.As<RoutePart>().Slug, blog.Name)
}

View File

@@ -6,16 +6,17 @@
<fieldset>
<div>
@Html.LabelFor(m => m.Path, T("For Blog"))
<select id="@Html.FieldIdFor(m => m.Path)" name="@Html.FieldNameFor(m => m.Path)">
@Html.LabelFor(m => m.Slug, T("For Blog"))
<select id="@Html.FieldIdFor(m => m.Slug)" name="@Html.FieldNameFor(m => m.Slug)">
@foreach(BlogPart blog in Model.Blogs) {
@Html.SelectOption(Model.Path, blog.As<RoutePart>().Path, blog.Name)
@Html.SelectOption(Model.Slug , blog.As<RoutePart>().Slug, blog.Name)
}
</select>
<span class="hint">@T("Select which blog you want to display the recent posts for")</span>
</div>
<div>
@Html.LabelFor(m => m.Count, T("Count"))
@Html.TextBoxFor(m => m.Count)
@Html.TextBoxFor(m => m.Count, new { @class = "text-small"})
<span class="hint">@T("Number of posts to display. Zero for all.")</span>
</div>
</fieldset>