Подтвердить что ты не робот

Добавление поля в ContentType в Orchard DataMigration

Я создал ContentType в моей миграции данных, которая сваривает несколько ContentParts вместе.

В Администраторе содержимого сайта Orchard я могу добавить поле в ContentType (но не ContentPart), а при миграции данных только кажется возможным добавить поле в ContentPart (а не ContentType).

Я хотел бы добавить поле в ContentType в перенос, поэтому я могу контролировать его размещение с помощью layout.info.

Возможно, это не важно, и есть еще один способ добиться добавления поля в перенос, а затем возможность контролировать, где он размещается с помощью layout.info и как он выглядит с использованием шаблона.

4b9b3361

Ответ 1

Фактически вы не можете прикрепить поле к типу содержимого. Когда вы присоединяете его к типу контента в пользовательском интерфейсе администратора, Orchard делает некоторые магии за кулисами, чтобы скрыть этот факт от вас - он создает часть содержимого внутри этого типа контента с тем же именем, что и тип содержимого, а затем присоединяет поле к этой новой части содержимого.

Вы можете проверить это, добавив поле через пользовательский интерфейс администратора, а затем перейдя в Импорт/Экспорт и экспортируя метаданные для ваших типов контента.

Чтобы прикрепить поле с помощью миграции, сделайте то же самое. Если у вас нет части контента, которая является подходящим местом для присоединения к полю, я использую соглашение, чтобы создать одно с тем же именем, что и тип содержимого, с ошибкой, дополненной "Частью". Итак, скажем, ваш тип контента - "VideoGame":

ContentDefinitionManager.AlterPartDefinition(
    "VideoGamePart"
    , b => b
        .Attachable()
        .WithField("ThumbnailImage", cfg => cfg.OfType("MediaPickerField").WithDisplayName("Video game box cover image"))
);
// Type: 
ContentDefinitionManager.AlterTypeDefinition(
    "VideoGame"
    , cfg =>
        cfg
            .WithPart("VideoGamePart")
            .WithPart("IdentityPart")
            .WithPart("TitlePart")
            .WithPart("CommonPart")
            .Creatable()
);

Все поля привязаны к частям, а не к типам, поэтому вы, естественно, можете управлять размещением с помощью layout.info и шаблонов, используя этот метод миграции, как вы можете, если вы определяете поле через пользовательский интерфейс.