This tutorial explains how to access Archives and the corresponding Posts.
Archive pages are just a special kind of page that are used for structuring posts, categories and tags. The page Id
is the key that is referenced in the field BlogId
on the posts.
Archive Pages are loaded the same way as normal pages through the IPageService
in the IApi
. The post archive model is loaded from the IArchiveService
and can be filtered on time period, category and tag.
All posts can be accessed from the PostService
in the IApi
using IApi.Posts
. Each post has a foreign key BlogId
that specifies which Archive Page it belongs to. You can access posts directly by calling the IPostService
in the IApi
This will get all Posts from all Archive Pages.
var allPosts = api.Posts.GetAll<Piranha.Models.PostBase>();
This will get all Posts from a single Archive Page.
var archivePosts = api.Posts.GetAll<Piranha.Models.PostBase>(archivePageId);
Requesting Posts as PostBase
(an abstract base class) will in fact get all Post types.
You can filter the returned Post by the Post type:
// This gets all post types
var allPosts = api.Posts.GetAll<Piranha.Models.PostBase>();
// This gets all posts without regions & blocks
var smallPosts = api.Posts.GetAll<Piranha.Models.PostInfo>();
// This gets just a specific post type
var somePosts = api.Posts.GetAll<MySpecificPostType>();
If you need to do advanced queries you can query the DbContext
directly by injecting Piranha.IDb
into you class. If you're using cache it is recommended to select the Id
of the posts and then retrieve them through the IApi
as posts will be cached.
Here is an example for retrieving the ten latest Posts from all Archives:
var tenLatestPostsFromAllArchives = db.Posts
.Where(p => p.Published >= DateTime.Now)
.OrderByDescending(p => p.Published)
.Take(10)
.Select(p => p.Id)
.ToList();
var posts = new List<Piranha.Models.PostBase>();
foreach (var id in tenLatestPostsFromAllArchives)
{
posts.Add(api.Posts.GetById<Piranha.Models.PostBase>(id);
}
Instead of Piranha.Models.PostBase
you can as well take other types as mentioned above.
If you have full cache enabled, GetById
will be cached and the posts will only be fetched from the database the first time. If you can't use caching you can also do more advanced queries to actually select the data using the DbContext
and transform them using the ContentService
.
Other frequently used data from Posts are Categories and Tags, e.g. to build a category list or a tag cloud. You'll need the StandardArchive.Id
as an argument to the following IApi
methods. In the Archive razor page you could the following:
var categories = await api.GetAllCategoriesAsync(WebApp.CurrentPage.Id);
var tags = await api.GetAllTagsAsync(WebApp.CurrentPage.Id);