#: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;
using Orchard.ContentManagement.Drivers; using Orchard.ContentManagement.Drivers;
using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.Handlers;
using Orchard.Core.Routable.Models;
namespace Orchard.Blogs.Drivers { namespace Orchard.Blogs.Drivers {
public class BlogArchivesPartDriver : ContentPartDriver<BlogArchivesPart> { public class BlogArchivesPartDriver : ContentPartDriver<BlogArchivesPart> {
private readonly IBlogService _blogService; private readonly IBlogService _blogService;
private readonly IBlogPostService _blogPostService; private readonly IBlogPostService _blogPostService;
private readonly IContentManager _contentManager;
private readonly IBlogPathConstraint _blogPathConstraint; private readonly IBlogPathConstraint _blogPathConstraint;
public BlogArchivesPartDriver( public BlogArchivesPartDriver(
IBlogService blogService, IBlogService blogService,
IBlogPostService blogPostService, IBlogPostService blogPostService,
IBlogPathConstraint blogPathConstraint) { IContentManager contentManager) {
_blogService = blogService; _blogService = blogService;
_blogPostService = blogPostService; _blogPostService = blogPostService;
_blogPathConstraint = blogPathConstraint; _contentManager = contentManager;
} }
protected override DriverResult Display(BlogArchivesPart part, string displayType, dynamic shapeHelper) { protected override DriverResult Display(BlogArchivesPart part, string displayType, dynamic shapeHelper) {
return ContentShape("Parts_Blogs_BlogArchives", return ContentShape("Parts_Blogs_BlogArchives",
() => { () => {
var path = _blogPathConstraint.FindPath(part.ForBlog); BlogPart blog = GetBlogFromSlug(part.ForBlog);
BlogPart blog = _blogService.Get(path);
if (blog == null) if (blog == null)
return null; return null;
@@ -37,7 +38,7 @@ namespace Orchard.Blogs.Drivers {
protected override DriverResult Editor(BlogArchivesPart part, dynamic shapeHelper) { protected override DriverResult Editor(BlogArchivesPart part, dynamic shapeHelper) {
var viewModel = new BlogArchivesViewModel { var viewModel = new BlogArchivesViewModel {
Path = part.ForBlog, Slug = part.ForBlog,
Blogs = _blogService.Get().ToList().OrderBy(b => b.Name) 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) { protected override DriverResult Editor(BlogArchivesPart part, IUpdateModel updater, dynamic shapeHelper) {
var viewModel = new BlogArchivesViewModel(); var viewModel = new BlogArchivesViewModel();
if (updater.TryUpdateModel(viewModel, Prefix, null, null)) { if (updater.TryUpdateModel(viewModel, Prefix, null, null)) {
part.ForBlog = viewModel.Path; part.ForBlog = viewModel.Slug;
} }
return Editor(part, shapeHelper); return Editor(part, shapeHelper);
@@ -64,5 +65,11 @@ namespace Orchard.Blogs.Drivers {
protected override void Exporting(BlogArchivesPart part, ExportContentContext context) { protected override void Exporting(BlogArchivesPart part, ExportContentContext context) {
context.Element(part.PartDefinition.Name).SetAttributeValue("BlogSlug", part.ForBlog); 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.Drivers;
using Orchard.ContentManagement.Handlers; using Orchard.ContentManagement.Handlers;
using Orchard.Core.Common.Models; using Orchard.Core.Common.Models;
using Orchard.Core.Routable.Models;
namespace Orchard.Blogs.Drivers { namespace Orchard.Blogs.Drivers {
public class RecentBlogPostsPartDriver : ContentPartDriver<RecentBlogPostsPart> { public class RecentBlogPostsPartDriver : ContentPartDriver<RecentBlogPostsPart> {
private readonly IBlogService _blogService; private readonly IBlogService _blogService;
private readonly IContentManager _contentManager; private readonly IContentManager _contentManager;
private readonly IBlogPathConstraint _blogPathConstraint;
public RecentBlogPostsPartDriver( public RecentBlogPostsPartDriver(
IBlogService blogService, IBlogService blogService,
IContentManager contentManager, IContentManager contentManager) {
IBlogPathConstraint blogPathConstraint) {
_blogService = blogService; _blogService = blogService;
_contentManager = contentManager; _contentManager = contentManager;
_blogPathConstraint = blogPathConstraint;
} }
protected override DriverResult Display(RecentBlogPostsPart part, string displayType, dynamic shapeHelper) { protected override DriverResult Display(RecentBlogPostsPart part, string displayType, dynamic shapeHelper) {
var path = _blogPathConstraint.FindPath(part.ForBlog); BlogPart blog = GetBlogFromSlug(part.ForBlog);
BlogPart blog = _blogService.Get(path);
if (blog == null) { if (blog == null) {
return null; return null;
@@ -49,7 +46,7 @@ namespace Orchard.Blogs.Drivers {
protected override DriverResult Editor(RecentBlogPostsPart part, dynamic shapeHelper) { protected override DriverResult Editor(RecentBlogPostsPart part, dynamic shapeHelper) {
var viewModel = new RecentBlogPostsViewModel { var viewModel = new RecentBlogPostsViewModel {
Count = part.Count, Count = part.Count,
Path = part.ForBlog, Slug = part.ForBlog,
Blogs = _blogService.Get().ToList().OrderBy(b => b.Name) 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) { protected override DriverResult Editor(RecentBlogPostsPart part, IUpdateModel updater, dynamic shapeHelper) {
var viewModel = new RecentBlogPostsViewModel(); var viewModel = new RecentBlogPostsViewModel();
if (updater.TryUpdateModel(viewModel, Prefix, null, null)) { if (updater.TryUpdateModel(viewModel, Prefix, null, null)) {
part.ForBlog = viewModel.Path; part.ForBlog = viewModel.Slug;
part.Count = viewModel.Count; 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("BlogSlug", part.ForBlog);
context.Element(part.PartDefinition.Name).SetAttributeValue("Count", part.Count); 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 { namespace Orchard.Blogs.Models {
public class RecentBlogPostsPart : ContentPart<RecentBlogPostsPartRecord> { public class RecentBlogPostsPart : ContentPart<RecentBlogPostsPartRecord> {
public string ForBlog { public string ForBlog {
get { return Record.BlogSlug; } get { return Record.BlogSlug; }
set { Record.BlogSlug = value; } set { Record.BlogSlug = value; }

View File

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

View File

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

View File

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

View File

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

View File

@@ -6,16 +6,17 @@
<fieldset> <fieldset>
<div> <div>
@Html.LabelFor(m => m.Path, T("For Blog")) @Html.LabelFor(m => m.Slug, T("For Blog"))
<select id="@Html.FieldIdFor(m => m.Path)" name="@Html.FieldNameFor(m => m.Path)"> <select id="@Html.FieldIdFor(m => m.Slug)" name="@Html.FieldNameFor(m => m.Slug)">
@foreach(BlogPart blog in Model.Blogs) { @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> </select>
<span class="hint">@T("Select which blog you want to display the recent posts for")</span> <span class="hint">@T("Select which blog you want to display the recent posts for")</span>
</div> </div>
<div> <div>
@Html.LabelFor(m => m.Count, T("Count")) @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> </div>
</fieldset> </fieldset>