Orchard CMS 1.7 - расширение типа медиа контента для получения функциональности типа тега

Проблема:

У меня есть ситуация, когда я должен пометить элементы мультимедиа с географическими идентификаторами. Я пытался повторить функционалисты модуля тегов и создал модели, виды, диски и обработчик для GeoObject. Моя проблема в том, что при загрузке представления редактирования изображения я не получаю свое представление редактирования GeoObject.

Вот мой обработчик:

class GeoObjectsPartHandler:ContentHandler {
    public GeoObjectsPartHandler(IRepository<GeoObjectsPartRecord> repository, IGeoObjectService geoObjectService)
    {
        Filters.Add(StorageFilter.For(repository));

        OnIndexing<GeoObjectsPart>(
            (context, geoObjectsPart) =>
            {
                foreach (var geoObject in geoObjectsPart.CurrentGeoObjects)
                {
                    context.DocumentIndex.Add("geoObjects", geoObject.GeoObjectName).Analyze();
                }
            });
    }
}

Водитель:

[UsedImplicitly]
class GeoObjectsPartDriver: ContentPartDriver<GeoObjectsPart>
{
    private static readonly char[] _disalowedChars = new[] { '<', '>', '*', '%', ':', '&', '\\', '"', '|' };
    private const string TemplateName = "Parts/GeoObjects";
    private readonly INotifier _notifier;
    private readonly IGeoObjectService _geoObjectService;

    public GeoObjectsPartDriver(IGeoObjectService geoObjectService, INotifier notifier)
    {
        _geoObjectService = geoObjectService;
        _notifier = notifier;
        T = NullLocalizer.Instance;
    }

    public Localizer T { get; set; }

    protected override string Prefix
    {
        get { return "GeoObjects"; }
    }

    protected override DriverResult Editor(GeoObjectsPart part, dynamic shapeHelper)
    {
        return ContentShape("Parts_GeoObjects_Edit",
                () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: BuildEditorViewModel(part), Prefix: Prefix));
    }

    protected override DriverResult Editor(GeoObjectsPart part, IUpdateModel updater, dynamic shapeHelper)
    {
        var model = new EditGeoObjectsViewModel();
        return ContentShape("Parts_GeoObjects_Edit",
                () => shapeHelper.EditorTemplate(TemplateName: TemplateName, Model: model, Prefix: Prefix));

    }

    private static EditGeoObjectsViewModel BuildEditorViewModel(GeoObjectsPart part)
    {
        return new EditGeoObjectsViewModel
        {
            GeoObjects = string.Join(", ", part.CurrentGeoObjects.Select((t, i) => t.GeoObjectName).ToArray())
        };
    }

    protected override void Importing(GeoObjectsPart part, ImportContentContext context)
    {
        var geoObjectString = context.Attribute(part.PartDefinition.Name, "GeoObjects");
    }

    protected override void Exporting(GeoObjectsPart part, ExportContentContext context)
    {
        context.Element(part.PartDefinition.Name).SetAttributeValue("GeoObjects", String.Join(",", part.CurrentGeoObjects.Select(t => t.GeoObjectName)));
    }
}

Миграция:

using Orchard.Data.Migration;
using Orchard.ContentManagement.MetaData;
using Orchard.Core.Contents.Extensions;
namespace ePageo.TUI.MediaManager
{
    public class MediaManagerDataMigration : DataMigrationImpl
    {
        public int Create()
        {
            SchemaBuilder.CreateTable("GeoObjectsPartRecord",
                table => table
                    .ContentPartRecord()
                );

            SchemaBuilder.CreateTable("GeoObjectRecord",
                table => table
                    .Column<int>("Id", column => column.PrimaryKey().Identity())
                    .Column<string>("GeoObjectName")
                );

            SchemaBuilder.CreateTable("ContentGeoObjectRecord",
                table => table
                    .Column<int>("Id", column => column.PrimaryKey().Identity())
                    .Column<int>("GeoObjectRecord_Id")
                    .Column<int>("GeoObjectsPartRecord_Id")
                );

            ContentDefinitionManager.AlterPartDefinition("GeoObjectsPart", builder => builder.Attachable());


            return 1;
        }

        public int UpdateFrom1()
        {
            ContentDefinitionManager.AlterPartDefinition("GeoObjectsPart", builder => builder
                .WithDescription("Allows to add Geo-object ids to the particular media Item."));
            return 2;
        }

        public int UpdateFrom2()
        {
            ContentDefinitionManager.AlterTypeDefinition("Image", td => td
                .WithPart("GeoObjectsPart")
            );

            ContentDefinitionManager.AlterTypeDefinition("Video", td => td
                .WithPart("GeoObjectsPart")
            );

            ContentDefinitionManager.AlterTypeDefinition("Audio", td => td
                .WithPart("GeoObjectsPart")
            );

            ContentDefinitionManager.AlterTypeDefinition("Document", td => td
                .WithPart("GeoObjectsPart")
            );

            ContentDefinitionManager.AlterTypeDefinition("OEmbed", td => td
                .WithPart("GeoObjectsPart")
            );
            return 3;
        }

    }
}

Placement.info:

<Placement>
    <Place Parts_GeoObjects_Edit="Content:12"/>
</Placement>

Я не думаю, что у меня есть проблема в моей модели, так как это точная копия моделей Orchard Tags. На самом деле все вышеперечисленные файлы просто так.

Я просто не могу заставить представление редактирования Geo Object отображаться в представлении редактирования Image (Media).

Мне нужна помощь!

1 ответ

Решение

Я получил код для работы.

Оказывается, мне пришлось объявить классы Driver и Handler public,

Я только что перешел с PHP на ASP.NET несколько месяцев назад, так что, если бы мы не объявили какую-либо область видимости, PHP принял бы ее как общедоступную, я подумал, что это будет то же самое с ASP.NET.

Сам код не имел никаких других проблем, кроме этого.

Другие вопросы по тегам