Orchardに2つのブログがあります。1つはCompanyNews用で、もう1つはメンバーの出版物用です。
CompanyNewsブログからの投稿のサブセットを表示するウィジェットを作成したいと思います。
Orchardで、ContentType BlogPostとBlogIdでフィルタリングするクエリを作成することは可能ですか?コンテンツタイプによるフィルターは見つかりましたが、BlogIdによるフィルターは見つかりませんでした。
Orchardに2つのブログがあります。1つはCompanyNews用で、もう1つはメンバーの出版物用です。
CompanyNewsブログからの投稿のサブセットを表示するウィジェットを作成したいと思います。
Orchardで、ContentType BlogPostとBlogIdでフィルタリングするクエリを作成することは可能ですか?コンテンツタイプによるフィルターは見つかりましたが、BlogIdによるフィルターは見つかりませんでした。
これは、モジュール内に追加する非常に単純なフィルターになります。これは、IDでフィルタリングするハードコードされた例です...
public class ContentIdFilter : IFilterProvider {
private const int HardCodedId = 99;
public ContentIdFilter() {
T = NullLocalizer.Instance;
}
public Localizer T { get; set; }
public void Describe(DescribeFilterContext describe) {
describe.For("Content", T("Content"), T("Content"))
.Element("ContentId", T("Content Id"), T("Content w/ Id: " + HardCodedId.ToString()),
ApplyFilter,
DisplayFilter,
null);
}
public void ApplyFilter(dynamic context) {
var query = (IHqlQuery)context.Query;
context.Query = query.Where(x => x.ContentItem(), x => x.Eq("Id", HardCodedId));
}
public LocalizedString DisplayFilter(dynamic context) {
return T("Content w/ Id: " + HardCodedId.ToString());
}
}
Id番号を構成可能にするための方法はもう少しありますが、これで正しい方向に進むはずです。
私はフィルターで少し遊んだことがあります、そしてこれは私がしたことです。このフィルターを使用すると、サイトにあるブログの1つに基づいてBlogPostをフィルター処理できます。複数のブログがあり、1つか2つだけの最近の投稿を表示したい場合に便利です。
わたしにはできる。
コメントをいただければ幸いです。
using System;
using System.Linq;
using System.Web.Mvc;
using Orchard.Blogs.Models;
using Orchard.ContentManagement;
using Orchard.Core.Common.Models;
using Orchard.DisplayManagement;
using Orchard.Forms.Services;
using Orchard.Localization;
using Orchard.Projections.Descriptors.Filter;
using IFilterProvider = Orchard.Projections.Services.IFilterProvider;
namespace Orchard.Projections.Providers.Filters
{
public class BlogPostFilter : IFilterProvider
{
private readonly IContentManager _contentManager;
public BlogPostFilter(
IContentManager contentManager)
{
_contentManager = contentManager;
T = NullLocalizer.Instance;
}
public Localizer T { get; set; }
public void Describe(DescribeFilterContext describe)
{
describe.For("Blogs", T("Blogs"), T("Blogs"))
.Element("Blogs", T("Blogs"), T("Posts in blogs"),
ApplyFilter,
DisplayFilter,
"BlogPostFilter");
}
public void ApplyFilter(dynamic context)
{
var blogIds = (string)context.State.Blogs;
if (!String.IsNullOrEmpty(blogIds)) {
var ids = blogIds.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var query = (IHqlQuery)context.Query;
context.Query = query.Where(x => x.ContentPartRecord<CommonPartRecord>(), x => x.In("Container.Id", ids));
}
}
public LocalizedString DisplayFilter(dynamic context)
{
var blogIds = (string)context.State.Blogs;
if (!String.IsNullOrEmpty(blogIds)) {
var ids = Array.ConvertAll(blogIds.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries), s => int.Parse(s));;
var names = _contentManager.GetMany<BlogPart>(ids, VersionOptions.Published, QueryHints.Empty);
return T("Posts in blogs: " + string.Join(", ", names.Select(x => x.Name)));
}
return T("Posts in blogs");
}
}
public class BlogPostFilterForms : IFormProvider
{
private readonly IContentManager _contentManager;
protected dynamic Shape { get; set; }
public Localizer T { get; set; }
public BlogPostFilterForms(
IShapeFactory shapeFactory,
IContentManager contentManager)
{
_contentManager = contentManager;
Shape = shapeFactory;
T = NullLocalizer.Instance;
}
public void Describe(DescribeContext context)
{
Func<IShapeFactory, object> form =
shape => {
var f = Shape.Form(
Id: "AnyOfBlogPart",
_Parts: Shape.SelectList(
Id: "blogs", Name: "Blogs",
Title: T("Blogs"),
Description: T("Select some blogs."),
Size: 10,
Multiple: true
)
);
f._Parts.Add(new SelectListItem { Value = "", Text = T("Any").Text });
foreach (var blog in _contentManager.Query<BlogPart>().List().OrderBy(x => x.Name)) {
f._Parts.Add(new SelectListItem { Value = blog.Id.ToString(), Text = blog.Name });
}
return f;
};
context.Form("BlogPostFilter", form);
}
}
}