2012-10-16 47 views
0

我有一個名爲職業的頁面,列出了所有與他們的標籤發佈的工作。點擊工作並轉到他們的描述後,我想要顯示類似工作列表。爲此,我嘗試使用Orchard的標籤模塊獲取所有標籤名稱並將其放入搜索框中。如何使用標籤服務獲取與Orchard CMS中的內容類型相關聯的標籤?

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

您無法獲取與內容類型相關的標籤,因爲內容類型僅僅是藍圖內容項目創建的;您標記的內容是內容項目,因此您想要獲取與內容項目相關的標籤。

要獲得相同標籤的物品,你必須在第一問題獲取內容項目的標籤:

contentItem.As<TagsPart>().CurrentTags 

然後你就可以獲取具有特定標籤的內容項:

tagService.GetTaggedContentItems(tagId) 

其中tagId是從CurrentTags獲取的標記的標識(標記具有Id屬性)。

+0

感謝您的幫助! –

+0

很高興爲你效勞! – Piedone

相關問題