0

タグ付きで投稿されたすべての仕事を一覧表示する 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();
        }
    }
  }

ただし、このコードは機能していないようです。お知らせ下さい。

前もって感謝します!

4

1 に答える 1

0

コンテンツ タイプは、コンテンツ アイテムが作成される青写真に過ぎないため、コンテンツ タイプに関連付けられたタグを取得することはできません。タグを付けるのはコンテンツ アイテムであるため、コンテンツアイテムに関連付けられたタグを取得する必要があります。

同じタグを持つアイテムを取得するには、最初に問題のコンテンツ アイテムのタグを取得する必要があります。

contentItem.As<TagsPart>().CurrentTags

次に、特定のタグを持つコンテンツ アイテムを取得できます。

tagService.GetTaggedContentItems(tagId)

ここで、tagId は CurrentTags からフェッチされたタグの ID です (タグには Id プロパティがあります)。

于 2012-10-16T13:37:43.293 に答える