タグ付きで投稿されたすべての仕事を一覧表示する Careers というページがあります。仕事をクリックして説明に移動した後、類似の仕事のリストを表示したいと思います。このために、Orchard の Tags モジュールを使用してすべてのタグ名を取得し、それを searchbuilder に入れようとしています。
namespace SimpleJobs.Handlers
{
public class SimpleJobsHandler : ContentHandler
{
//adding IContentManager and IIndexmanager which performs actual search
private readonly IContentManager _contentManager;
private readonly IIndexManager _indexManager;
private readonly ITagService _tagService;
public SimpleJobsHandler(IRepository<SimpleJobsPartRecord> simpleJobsPartRepository,
IContentManager contentManager,
IIndexManager indexManager,
ITagService tagService
)
{
_contentManager = contentManager;
_indexManager = indexManager;
_tagService = tagService;
Filters.Add(StorageFilter.For(simpleJobsPartRepository));
}
//building display shape
protected override void BuildDisplayShape(BuildDisplayContext context)
{
if (context.ContentItem.ContentType == "Jobs")
{
var similarJobs = GetSimilarJobs(context.ContentItem);
if (similarJobs.Any())
{
context.Shape.SimilarJobs = context.New.SimilarJobs(Jobs: similarJobs);
}
}
}
//getting similar jobs using tags
private IEnumerable<ContentItem> GetSimilarJobs(ContentItem displayedJob)
{
StringBuilder tagStringBuilder = new StringBuilder();
var searchBuilder = GetSearchBuilder();
var simpleJobsTags = _tagService.GetTags();
foreach (var tag in simpleJobsTags){
tagStringBuilder.Append(" ");
tagStringBuilder.Append(tag.TagName);
}
var similarItemsIds = searchBuilder
.WithField("type", "Jobs").Mandatory().ExactMatch()
.Parse("simplejobs-tags", tagStringBuilder.ToString()).Mandatory()
.Search()
.Where(h => h.ContentItemId != displayedJob.Id)
.Select(h => h.ContentItemId)
.Take(5).ToList();
return _contentManager.GetMany<ContentItem>(similarItemsIds, VersionOptions.Published, QueryHints.Empty);
}
//to check if the user has lucene type implementer enabled otherwise
//return a nullsearchbuilder instead of an error
private ISearchBuilder GetSearchBuilder()
{
return _indexManager.HasIndexProvider()
? _indexManager.GetSearchIndexProvider().CreateSearchBuilder("Search")
: new NullSearchBuilder();
}
}
}
ただし、このコードは機能していないようです。お知らせ下さい。
前もって感謝します!