我有一个名为Careers的页面,其中列出了所有使用其标签发布的作业。单击作业并转到其描述后,我想显示类似作业列表。为此,我尝试使用Orchard的Tags模块获取所有标记名称并将其放入搜索构建器中。
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();
}
}
}
但是,此代码似乎不起作用。请指教。
提前致谢!
答案 0 :(得分:0)
您无法提取与内容类型相关联的标记,因为内容类型只是蓝图内容项是从中创建的;您标记的是内容项,因此您希望获取与内容项相关联的标记。
要获取具有相同标签的商品,您必须首先获取相关内容项的代码:
contentItem.As<TagsPart>().CurrentTags
然后,您可以获取具有特定标记的内容项:
tagService.GetTaggedContentItems(tagId)
其中tagId是从CurrentTags获取的标记的id(标记具有Id属性)。