Adding Blog pagination

- Yeah !!!!

--HG--
branch : dev
This commit is contained in:
Sebastien Ros
2010-10-13 15:42:36 -07:00
parent 75353a718f
commit e0db263538
10 changed files with 108 additions and 9 deletions

View File

@@ -1,3 +1,4 @@
using System;
using System.Linq; using System.Linq;
using System.Web; using System.Web;
using System.Web.Mvc; using System.Web.Mvc;
@@ -6,6 +7,7 @@ using System.Xml.Linq;
using Orchard.Blogs.Models; using Orchard.Blogs.Models;
using Orchard.Blogs.Routing; using Orchard.Blogs.Routing;
using Orchard.Blogs.Services; using Orchard.Blogs.Services;
using Orchard.Blogs.ViewModels;
using Orchard.DisplayManagement; using Orchard.DisplayManagement;
using Orchard.Logging; using Orchard.Logging;
using Orchard.Mvc.Results; using Orchard.Mvc.Results;
@@ -16,12 +18,14 @@ namespace Orchard.Blogs.Controllers {
public class BlogController : Controller { public class BlogController : Controller {
private readonly IOrchardServices _services; private readonly IOrchardServices _services;
private readonly IBlogService _blogService; private readonly IBlogService _blogService;
private readonly IBlogPostService _blogPostService;
private readonly IBlogSlugConstraint _blogSlugConstraint; private readonly IBlogSlugConstraint _blogSlugConstraint;
private readonly RouteCollection _routeCollection; private readonly RouteCollection _routeCollection;
public BlogController(IOrchardServices services, IBlogService blogService, IBlogSlugConstraint blogSlugConstraint, RouteCollection routeCollection, IShapeHelperFactory shapeHelperFactory) { public BlogController(IOrchardServices services, IBlogService blogService, IBlogPostService blogPostService, IBlogSlugConstraint blogSlugConstraint, RouteCollection routeCollection, IShapeHelperFactory shapeHelperFactory) {
_services = services; _services = services;
_blogService = blogService; _blogService = blogService;
_blogPostService = blogPostService;
_blogSlugConstraint = blogSlugConstraint; _blogSlugConstraint = blogSlugConstraint;
_routeCollection = routeCollection; _routeCollection = routeCollection;
Logger = NullLogger.Instance; Logger = NullLogger.Instance;
@@ -44,18 +48,31 @@ namespace Orchard.Blogs.Controllers {
} }
//TODO: (erikpo) Should move the slug parameter and get call and null check up into a model binder //TODO: (erikpo) Should move the slug parameter and get call and null check up into a model binder
public ActionResult Item(string blogSlug) { public ActionResult Item(string blogSlug, int page) {
const int pageSize = 10;
var correctedSlug = _blogSlugConstraint.FindSlug(blogSlug); var correctedSlug = _blogSlugConstraint.FindSlug(blogSlug);
if (correctedSlug == null) if (correctedSlug == null)
return new NotFoundResult(); return new NotFoundResult();
var blog = _blogService.Get(correctedSlug); BlogPart blog = _blogService.Get(correctedSlug);
if (blog == null) if (blog == null)
return new NotFoundResult(); return new NotFoundResult();
//todo: (heskew) "Blog" should be an alternative instead of a display type var blogPosts = _blogPostService.Get(blog, (page - 1)*pageSize, pageSize).Select(b => _services.ContentManager.BuildDisplay(b, "Summary.BlogPost"));
var model = _services.ContentManager.BuildDisplay(blog, "Blog");
var list = Shape.List();
list.AddRange(blogPosts);
var model = new DisplayBlogViewModel {
BlogPostList = list,
BlogPart = blog,
Page = page,
PageSize = pageSize
};
return View(model); return View(model);
} }
public ActionResult LiveWriterManifest(string blogSlug) { public ActionResult LiveWriterManifest(string blogSlug) {

View File

@@ -107,6 +107,7 @@
<Compile Include="Services\IBlogService.cs" /> <Compile Include="Services\IBlogService.cs" />
<Compile Include="Services\XmlRpcHandler.cs" /> <Compile Include="Services\XmlRpcHandler.cs" />
<Compile Include="ViewModels\BlogPostArchiveViewModel.cs" /> <Compile Include="ViewModels\BlogPostArchiveViewModel.cs" />
<Compile Include="ViewModels\DisplayBlogViewModel.cs" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="Content\Admin\images\draft.gif" /> <Content Include="Content\Admin\images\draft.gif" />
@@ -118,6 +119,7 @@
<Content Include="Scripts\archives.js" /> <Content Include="Scripts\archives.js" />
<Content Include="Styles\admin.css" /> <Content Include="Styles\admin.css" />
<Content Include="Styles\archives.css" /> <Content Include="Styles\archives.css" />
<Content Include="Styles\pagination.css" />
<Content Include="Views\BlogAdmin\Create.cshtml" /> <Content Include="Views\BlogAdmin\Create.cshtml" />
<Content Include="Views\BlogAdmin\Edit.cshtml" /> <Content Include="Views\BlogAdmin\Edit.cshtml" />
<Content Include="Views\BlogAdmin\Item.cshtml" /> <Content Include="Views\BlogAdmin\Item.cshtml" />
@@ -131,7 +133,6 @@
<Content Include="Views\Parts\Blogs.Blog.Manage.cshtml" /> <Content Include="Views\Parts\Blogs.Blog.Manage.cshtml" />
<Content Include="Views\Parts\Blogs.Blog.Description.cshtml" /> <Content Include="Views\Parts\Blogs.Blog.Description.cshtml" />
<Content Include="Views\Parts\Common.Metadata.Admin.Blog.cshtml" /> <Content Include="Views\Parts\Common.Metadata.Admin.Blog.cshtml" />
<Content Include="Views\Parts\Blogs.BlogPost.List.cshtml" />
<Content Include="Views\EditorTemplates\Parts\Blogs.Blog.Fields.cshtml" /> <Content Include="Views\EditorTemplates\Parts\Blogs.Blog.Fields.cshtml" />
<Content Include="Views\Parts\Blogs.BlogPost.List.Admin.cshtml"> <Content Include="Views\Parts\Blogs.BlogPost.List.Admin.cshtml">
<SubType>Code</SubType> <SubType>Code</SubType>
@@ -190,6 +191,7 @@
<None Include="Views\DisplayTemplates\Parts\Blogs.BlogArchives.cshtml" /> <None Include="Views\DisplayTemplates\Parts\Blogs.BlogArchives.cshtml" />
<None Include="Views\EditorTemplates\Parts\Blogs.RecentBlogPosts.cshtml" /> <None Include="Views\EditorTemplates\Parts\Blogs.RecentBlogPosts.cshtml" />
<None Include="Views\EditorTemplates\Parts\Blogs.BlogArchives.cshtml" /> <None Include="Views\EditorTemplates\Parts\Blogs.BlogArchives.cshtml" />
<None Include="Views\Parts\Blogs.BlogPost.List.cshtml" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" /> <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />

View File

@@ -259,6 +259,24 @@ namespace Orchard.Blogs {
Priority = 11, Priority = 11,
Route = new Route( Route = new Route(
"{blogSlug}", "{blogSlug}",
new RouteValueDictionary {
{"area", "Orchard.Blogs"},
{"controller", "Blog"},
{"action", "Item"},
{"page", 1}
},
new RouteValueDictionary {
{"blogSlug", _blogSlugConstraint}
},
new RouteValueDictionary {
{"area", "Orchard.Blogs"}
},
new MvcRouteHandler())
},
new RouteDescriptor {
Priority = 11,
Route = new Route(
"{blogSlug}/Page/{*page}",
new RouteValueDictionary { new RouteValueDictionary {
{"area", "Orchard.Blogs"}, {"area", "Orchard.Blogs"},
{"controller", "Blog"}, {"controller", "Blog"},

View File

@@ -49,6 +49,11 @@ namespace Orchard.Blogs.Services {
return GetBlogQuery(blogPart, versionOptions).List().Select(ci => ci.As<BlogPostPart>()); return GetBlogQuery(blogPart, versionOptions).List().Select(ci => ci.As<BlogPostPart>());
} }
public IEnumerable<BlogPostPart> Get(BlogPart blogPart, int skip, int count) {
return GetBlogQuery(blogPart, VersionOptions.Published).Slice(skip, count).ToList().Select(ci => ci.As<BlogPostPart>());
}
public IEnumerable<BlogPostPart> Get(BlogPart blogPart, ArchiveData archiveData) { public IEnumerable<BlogPostPart> Get(BlogPart blogPart, ArchiveData archiveData) {
var query = GetBlogQuery(blogPart, VersionOptions.Published); var query = GetBlogQuery(blogPart, VersionOptions.Published);

View File

@@ -12,6 +12,7 @@ namespace Orchard.Blogs.Services {
IEnumerable<BlogPostPart> Get(BlogPart blogPart); IEnumerable<BlogPostPart> Get(BlogPart blogPart);
IEnumerable<BlogPostPart> Get(BlogPart blogPart, VersionOptions versionOptions); IEnumerable<BlogPostPart> Get(BlogPart blogPart, VersionOptions versionOptions);
IEnumerable<BlogPostPart> Get(BlogPart blogPart, ArchiveData archiveData); IEnumerable<BlogPostPart> Get(BlogPart blogPart, ArchiveData archiveData);
IEnumerable<BlogPostPart> Get(BlogPart blogPart, int skip, int count);
IEnumerable<KeyValuePair<ArchiveData, int>> GetArchives(BlogPart blogPart); IEnumerable<KeyValuePair<ArchiveData, int>> GetArchives(BlogPart blogPart);
void Delete(BlogPostPart blogPostPart); void Delete(BlogPostPart blogPostPart);
void Publish(BlogPostPart blogPostPart); void Publish(BlogPostPart blogPostPart);

View File

@@ -1,3 +1,3 @@
#main .blog-description p { #main .blog-description p {
margin-bottom:1em; margin-bottom:1em;
} }

View File

@@ -0,0 +1,19 @@
ul.pagination
{
list-style-type:none;
}
ul.pagination li a
{
font-size:13px;
}
ul.pagination li.newer
{
float:left;
}
ul.pagination li.older
{
float:right;
}

View File

@@ -0,0 +1,10 @@
using Orchard.Blogs.Models;
namespace Orchard.Blogs.ViewModels {
public class DisplayBlogViewModel {
public BlogPart BlogPart { get; set; }
public dynamic BlogPostList { get; set; }
public int Page { get; set; }
public int PageSize { get; set; }
}
}

View File

@@ -1 +1,28 @@
@Display(Model) @model Orchard.Blogs.ViewModels.DisplayBlogViewModel
@using Orchard.Blogs.Extensions;
@{
Style.Include("pagination.css");
}
@if (Model.BlogPostList.Items.Count > 0) {
@Display(Model.BlogPostList)
<ul class="pagination">
@if(Model.BlogPostList.Items.Count == Model.PageSize) {
<li class="older">
@Html.ActionLink(T("Older Posts").Text, "Item", new { Area = "Orchard.Blogs", blogSlug = Model.BlogPart.Slug, page = Model.Page + 1 })
</li>
}
@if(Model.Page > 1) {
<li class="newer">
@Html.ActionLink(T("Newer Posts").Text, "Item", new { Area = "Orchard.Blogs", blogSlug = Model.BlogPart.Slug, page = Model.Page - 1 })
</li>
}
</ul>
}
else {
<p>@T("There are no posts for this blog.")</p>
}

View File

@@ -5,4 +5,4 @@
@using Orchard.Core.Common.ViewModels; @using Orchard.Core.Common.ViewModels;
<h2>@Html.Link((string)Model.Title, Url.BlogPost((BlogPostPart)Model.ContentItem.Get(typeof(BlogPostPart))))</h2> <h2>@Html.Link((string)Model.Title, Url.BlogPost((BlogPostPart)Model.ContentItem.Get(typeof(BlogPostPart))))</h2>
<div class="meta">@Html.PublishedState(new CommonMetadataViewModel((CommonPart)Model.ContentItem.Get(typeof(CommonPart))), T) | @Display(Model.meta)</div> <div class="meta">@Html.PublishedState(new CommonMetadataViewModel((CommonPart)Model.ContentItem.Get(typeof(CommonPart))), T) | @Display(Model.meta)</div>
<div class="content">@Display(Model.Primary)</div> <div class="content">@Display(Model.Primary)</div>