如何使用Tags Service在Orchard CMS中获取与内容类型相关联的标签?

时间:2012-10-16 12:23:03

标签: asp.net-mvc-3 orchardcms

我有一个名为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();
        }
    }
  }

但是,此代码似乎不起作用。请指教。

提前致谢!

1 个答案:

答案 0 :(得分:0)

您无法提取与内容类型相关联的标记,因为内容类型只是蓝图内容项是从中创建的;您标记的是内容项,因此您希望获取与内容项相关联的标记。

要获取具有相同标签的商品,您必须首先获取相关内容项的代码:

contentItem.As<TagsPart>().CurrentTags

然后,您可以获取具有特定标记的内容项:

tagService.GetTaggedContentItems(tagId)

其中tagId是从CurrentTags获取的标记的id(标记具有Id属性)。