2013-10-28 4 views
0

과수원 CMS에서 분류 필드의 "확장"인 사용자 정의 필드를 만들려고합니다.사용자 정의 필드 - 과수원 CMS의 콘텐츠 항목에 용접

지금까지 간단히 다른 필드를 만들고 기본적으로 분류 필드를 실행하는 모든 코드를 복사했습니다. 그리고 일반 분류 필드와 사용자 지정 분류 필드가 콘텐츠 유형에 첨부되어 있으면 실제로 작동합니다 . 내 사용자 정의 필드에서 선택한 용어가 저장하고 예상대로 작동합니다.

표준 분류 필드를 제거하고 사용자 정의 필드 만 사용하면 문제가 발생합니다. 이는 더 이상 필요한 TermsPart가 콘텐츠 항목에 용접되지 않기 때문입니다. 로그인 오류 : I 중단 점을 설정하고 TaxonomyService 보면

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 

, 그것은 TermsPart으로 컨텐트 항목을로드 할 때, 그것은 따라서 NRE를 던지고, null를 돌려줍니다.

이 TermsPart를 콘텐츠 항목에 어떻게 용접 할 수 있는지 잘 모르겠습니다. 나는 Handler에서 일종의 일을 할 필요가 있다고 생각하지만, 이것을 해결하지 못했습니다. 그냥 내 코드를보고 그것이 잘못 알고 정말 예제 또는 뭔가와 올바른 방향으로 지적해야합니다.

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>(); 
     } 
    } 
} 

I 필드 드라이버에 대한 부분을 용접 아직 시도입니다 ...하지만 그 :

내 (지금까지도 중단 점을 공격하지 않습니다 꺼짐) 핸들러를 작동 비

그냥 너무 틀린 것 같습니다 (그래서 나는 아직 시도하지 않고 있습니다).

내 질문 : 필드를 사용하여 파트를 컨텐트 항목에 용접하는 방법은 무엇입니까?

답변

1

핸들러의 맨 위에 [UsedImplicitly] 데이터 주석을 추가하면 위의 핸들러가 실제로 작동합니다. 참고로 Field Handler는 다음과 같이 나타납니다.

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>(); 
      } 
     } 
    } 
} 

또 다른 평범한 순간이지만, 나는 그것을 알아낼 수있어서 기쁘다.

+0

감사합니다. 제가 찾고있는 것이 맞습니다! – devqon

관련 문제