2015-01-05 57 views
3

我在Orchard中創建了一個自定義模塊,它創建了一個新的部件,類型和一個自定義活動,但我正在努力處理我需要做的最後一部分,即創建所有與特定父項目相關聯的內容項目。例如,當有人創建「Trade Show」(來自我的模塊的新類型)時,可以創建各種子頁面(路線,供應商地圖等),因爲客戶一次只運行一個節目。我需要做的是,當他們創建一個新的展會時,我想獲得最近的展會前景(我正在通過_contentManager.HqlQuery().ForType("TradeShow").ForVersion(VersionOptions.Latest).ForVersion(VersionOptions.Published).List().Last()(正面展示,這不是最有效的方式,但它的工作原理和記錄數量是〜5年後),然後找到所有那些與舊節目相關的子頁面,並將它們複製到新的內容項目中,它們必須是副本,因爲有時它們可​​能不得不用舊節目參考部分, ?或者它可能會改變,等所有的通常的原因果園自定義工作流程活動

我如何去尋找所有引用的是,在活動之前展示的內容項這裏是我的活動滿級:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using Orchard.Autoroute.Services; 
using Orchard.ContentManagement; 
using Orchard.Localization; 
using Orchard.Projections.Models; 
using Orchard.Projections.Services; 
using Orchard.Workflows.Models; 
using Orchard.Workflows.Services; 
using Orchard.Workflows.Activities; 

namespace Orchard.Web.Modules.TradeShows.Activities 
{ 
public class TradeShowPublishedActivity : Task 
{ 
    private readonly IContentManager _contentManager; 
    private readonly IAutorouteService _autorouteService; 
    private readonly IProjectionManager _projectionManager; 

    public TradeShowPublishedActivity(IContentManager contentManager, IAutorouteService autorouteService, IProjectionManager projectionManager) 
    { 
     _contentManager = contentManager; 
     _autorouteService = autorouteService; 
     _projectionManager = projectionManager; 

     T = NullLocalizer.Instance; 
    } 

    public Localizer T { get; set; } 

    public override LocalizedString Category 
    { 
     get { return T("Flow"); } 
    } 

    public override LocalizedString Description 
    { 
     get { return T("Handles the automatic creation of content pages for the new show."); } 
    } 

    public override string Name 
    { 
     get { return "TradeShowPublished"; } 
    } 

    public override string Form 
    { 
     get { return null; } 
    } 

    public override IEnumerable<LocalizedString> GetPossibleOutcomes(WorkflowContext workflowContext, ActivityContext activityContext) 
    { 
     yield return T("Done"); 
    } 

    public override IEnumerable<LocalizedString> Execute(WorkflowContext workflowContext, ActivityContext activityContext) 
    { 
     var priorShow = _contentManager.HqlQuery().ForType("TradeShow").ForVersion(VersionOptions.Latest).ForVersion(VersionOptions.Published).List().Last(); 
     var tradeShowPart = priorShow.Parts.Where(p => p.PartDefinition.Name == "TradeShowContentPart").Single(); 

     //new show alias 
     //workflowContext.Content.ContentItem.As<Orchard.Autoroute.Models.AutoroutePart>().DisplayAlias 

     yield return T("Done"); 
    } 
} 

}

Migrations.cs文件設置一個用於子頁面引用父秀這樣的部分:

ContentDefinitionManager.AlterPartDefinition("AssociatedTradeShowPart", builder => builder.WithField("Trade Show", cfg => cfg.OfType("ContentPickerField") 
                                    .WithDisplayName("Trade Show") 
                                    .WithSetting("ContentPickerFieldSettings.Attachable", "true") 
                                    .WithSetting("ContentPickerFieldSettings.Description", "Select the trade show this item is for.") 
                                    .WithSetting("ContentPickerFieldSettings.Required", "true") 
                                    .WithSetting("ContentPickerFieldSettings.DisplayedContentTypes", "TradeShow") 
                                    .WithSetting("ContentPickerFieldSettings.Multiple", "false") 
                                    .WithSetting("ContentPickerFieldSettings.ShowContentTab", "true"))); 

然後,創建我的子頁面(只有一個了,但還有更多的來臨)像這樣:

ContentDefinitionManager.AlterTypeDefinition("ShowDirections", cfg => cfg.DisplayedAs("Show Directions") 
                       .WithPart("AutoroutePart", builder => builder.WithSetting("AutorouteSettings.AllowCustomPattern", "true") 
                                   .WithSetting("AutorouteSettings.AutomaticAdjustmentOnEdit", "false") 
                                   .WithSetting("AutorouteSettings.PatternDefinitions", "[{Name:'Title', Pattern: '{Content.Slug}', Description: 'international-trade-show'}]") 
                                   .WithSetting("AutorouteSettings.DefaultPatternIndex", "0")) 
                       .WithPart("CommonPart", builder => builder.WithSetting("DateEditorSettings.ShowDateEditor", "false")) 
                       .WithPart("PublishLaterPart") 
                       .WithPart("TitlePart") 
                       .WithPart("AssociatedTradeShowPart") /* allows linking to parent show */ 
                       .WithPart("ContainablePart", builder => builder.WithSetting("ContainablePartSettings.ShowContainerPicker", "true")) 
                       .WithPart("BodyPart")); 

回答

0

所以,你必須在展會內容項目,下一步將是找到一個ContentPickerField所有部分,再往下篩選列表中那些字段包含你的節目的ID。

 var items = _contentManager.Query().List().ToList() // Select all content items 
      .Select(p => (p.Parts 
       // Select all parts on content items 
      .Where(f => f.Fields.Where(d => 
       d.FieldDefinition.Name == typeof(ContentPickerField).Name && 
       // See if any of the fields are ContentPickerFields 
       (d as ContentPickerField).Ids.ToList().Contains(priorShow.Id)).Any()))); 
        // That field contains the Id of the show 

這可能會變得很貴,具體取決於數據庫中有多少內容項目。

相關問題