2013-10-28 90 views
0

在果園CMS中,我試圖創建一個自定義字段,它是分類標準字段的「擴展名」。從自定義字段焊接內容項的一部分 - 果園CMS

到目前爲止,我只是簡單地創建了另一個字段,並且基本上覆制了運行Taxonomy字段的所有代碼 - 並且當我將正常的Taxonomy字段和我的自定義Taxonomy字段附加到Content Type時, 。我的自定義字段中的選定條款保存並按預期工作。

我在刪除標準Taxonomy字段時遇到了問題,並且僅使用我的自定義字段。這是因爲不再需要將條款部分焊接到內容項目上。記錄的錯誤是:

Orchard.ContentManagement.Drivers.Coordinators.ContentFieldDriverCoordinator - NullReferenceException thrown from <>f__AnonymousType4`2 by <>f__AnonymousType4`2[[Orchard.ContentManagement.ContentPart, Orchard.Framework, Version=1.7.1.0, Culture=neutral, PublicKeyToken=null],[Fusion.ContentTiles.Fields.TaxonomyTileField, Fusion.ContentTiles, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null]] 
System.NullReferenceException: Object reference not set to an instance of an object. 
    at Orchard.Taxonomies.Services.TaxonomyService.UpdateTerms(ContentItem contentItem, IEnumerable`1 terms, String field) 
    at Fusion.ContentTiles.Drivers.TaxonomyTileFieldDriver.Editor(ContentPart part, TaxonomyTileField field, IUpdateModel updater, Object shapeHelper) 
    at Orchard.ContentManagement.Drivers.ContentFieldDriver`1.<>c__DisplayClass13.<Orchard.ContentManagement.Drivers.IContentFieldDriver.UpdateEditorShape>b__12(ContentPart part, TField field) in c:\Projects\Demos\Orchard\src\Orchard\ContentManagement\Drivers\ContentFieldDriver.cs:line 47 
    at Orchard.ContentManagement.Drivers.ContentFieldDriver`1.<>c__DisplayClass2d.<Process>b__2b(<>f__AnonymousType4`2 pf) in c:\Projects\Demos\Orchard\src\Orchard\ContentManagement\Drivers\ContentFieldDriver.cs:line 86 
    at Orchard.InvokeExtensions.<Invoke>d__0`2.MoveNext() in c:\Projects\Demos\Orchard\src\Orchard\InvokeExtensions.cs:line 39 

,當我設置一個斷點,並期待在TaxonomyService,當它試圖加載內容項作爲TermsPart,則返回null,這樣拋NRE。

我不完全確定如何將此TermsPart焊接到內容項目上。我猜想我需要在某種處理程序中執行此操作,但我無法解決這個問題。只要看看我的代碼,我知道這是錯誤的,真的需要通過示例或其他方式指向正確的方向。

我不工作的處理程序(這是很遙遠,它甚至不打一個斷點):

public class TaxonomyTileFieldHandler : ContentHandler { 
    private readonly IContentDefinitionManager _contentDefinitionManager; 

    public TaxonomyTileFieldHandler(
     IContentDefinitionManager contentDefinitionManager) { 
     _contentDefinitionManager = contentDefinitionManager; 
    } 

    protected override void Activating(ActivatingContentContext context) { 
     base.Activating(context); 

     // weld the TermsPart dynamically, if a field has been assigned to one of its parts 
     var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(context.ContentType); 
     if (contentTypeDefinition == null) { 
      return; 
     } 

     if (contentTypeDefinition.Parts.Any(
      part => part.PartDefinition.Fields.Any(
       field => field.FieldDefinition.Name == typeof(TaxonomyTileField).Name))) { 

      context.Builder.Weld<TermsPart>(); 
     } 
    } 
} 

我還沒有嘗試在該領域驅動焊接部分...但是,只是似乎錯了(這就是爲什麼我還沒有嘗試它)。

我的問題是:如何將零件焊接到帶字段的內容項上?

回答

1

所以上面的處理程序確實有效,一旦我將[UsedImplicitly]數據註釋添加到處理程序的頂部。作爲參考,我現場處理程序現在看起來像:

namespace Fusion.ContentTiles.Handlers { 
    [UsedImplicitly] 
    [OrchardFeature("Fusion.ContentTiles.TaxonomyExtensions")] 
    public class TaxonomyTileFieldHandler : ContentHandler { 
     private readonly IContentDefinitionManager _contentDefinitionManager; 

     public TaxonomyTileFieldHandler(
      IContentDefinitionManager contentDefinitionManager) { 
      _contentDefinitionManager = contentDefinitionManager; 
     } 

     protected override void Activating(ActivatingContentContext context) { 
      base.Activating(context); 

      // weld the TermsPart dynamically, if a field has been assigned to one of its parts 
      var contentTypeDefinition = _contentDefinitionManager.GetTypeDefinition(context.ContentType); 
      if (contentTypeDefinition == null) { 
       return; 
      } 

      if (contentTypeDefinition.Parts.Any(
       part => part.PartDefinition.Fields.Any(
        field => field.FieldDefinition.Name == typeof(TaxonomyTileField).Name))) { 

       context.Builder.Weld<TermsPart>(); 
      } 
     } 
    } 
} 

另一個facepalm時刻 - 但我很高興我能弄明白。

+0

謝謝,這正是我一直在尋找的! – devqon