将零件焊接到自定义字段的内容项 - 乌节 CMS

本文关键字:字段 CMS 乌节 自定义 零件 | 更新日期: 2023-09-27 18:37:08

在Orchard CMS中,我正在尝试创建一个自定义字段,它是分类字段的"扩展"。

到目前为止,我只是创建了另一个字段,并且基本上复制了运行分类字段的所有代码 - 当我将普通分类字段和自定义分类字段附加到内容类型时,它实际上可以工作。我的自定义字段中选定的术语将保存并按预期工作。

当我删除标准分类字段时,我遇到了问题,并且只使用我的自定义字段。这是因为不再将所需的条款部件焊接到内容项上。记录的错误是:

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 时,它会返回 null,从而抛出 NRE。

我不完全确定如何将此条款部分焊接到内容项上。我猜我需要在某种处理程序中执行此操作,但我无法解决这个问题。只是看看我的代码,我知道这是错误的,真的需要通过示例或其他东西指向正确的方向。

我的非工作处理程序(它离得太远了,甚至没有遇到断点):

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

我还没有尝试在现场焊接零件 司机...但这似乎很错误(这就是为什么我还没有尝试它)。

我的问题是:如何将零件焊接到具有字段的内容项上?

将零件焊接到自定义字段的内容项 - 乌节 CMS

因此,一旦我将[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>();
            }
        }
    }
}

另一个面对面的时刻 - 但我很高兴我能够弄清楚。