0

Orchard CMS で、タクソノミー フィールドの「拡張」であるカスタム フィールドを作成しようとしています。

これまでのところ、単純に別のフィールドを作成し、タクソノミー フィールドを実行するすべてのコードを基本的にコピーしました。通常のタクソノミー フィールドとカスタム タクソノミー フィールドの両方をコンテンツ タイプにアタッチすると、実際に機能します。カスタム フィールドで選択した条件が保存され、期待どおりに機能します。

標準のタクソノミー フィールドを削除して、カスタム フィールドだけを使用すると、問題が発生します。これは、必須の TermsPart がコンテンツ アイテムに結合されなくなったためです。ログに記録されたエラーは次のとおりです。

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 を調べると、Content Item を TermsPart としてロードしようとすると null が返され、NRE がスローされます。

この TermsPart を Content Item に結合する方法がよくわかりません。ある種の 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>();
        }
    }
}

私はまだフィールドドライバーで部品を溶接しようとしています...しかし、それはとても間違っているようです(それが私がまだそれを試みていない理由です).

私の質問は:フィールドを持つコンテンツ アイテムにパーツを溶接するにはどうすればよいですか?

4

1 に答える 1

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

別の手のひらの瞬間 - しかし、私はそれを理解できてよかった.

于 2013-10-28T07:31:12.063 に答える