问题 将字段添加到Orchard DataMigration中的ContentType


我在数据迁移中创建了一个ContentType,它将多个ContentPart连接在一起。

在Orchard站点内容管理员我可以向ContentType(但不是ContentPart)添加字段,并且在数据迁移中,似乎只能向ContentPart(而不是ContentType)添加字段。

我想在迁移中将该字段添加到ContentType中,因此我可以使用placement.info控制它的位置。

也许这并不重要,还有另一种方法可以实现在迁移中添加字段,然后使用placement.info以及使用模板的外观来控制它的放置位置。


4802
2018-01-28 18:41


起源



答案:


实际上,您无法将字段附加到内容类型。当你将它附加到管理界面中的内容类型时,Orchard在幕后做了一些魔术来隐藏这个事实 - 它在内容类型中创建一个内容部分,与内容类型同名,然后附加该新内容部分的字段。

您可以通过管理UI附加字段,然后转到导入/导出,然后导出内容类型的元数据来验证这一点。

要通过迁移附加字段,请执行相同的操作。如果你没有一个附加字段的好地方的内容部分,我使用的约定是创建一个与内容类型相同的名称,后缀为“Part”的bug。所以我们说你的内容类型是“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()
);

所有字段都附加到零件,而不是类型,因此您可以使用此迁移方法自然地使用placement.info和模板控制放置,如果您通过UI定义字段,则可以。


14
2018-01-28 21:38



谢谢,这有助于它有意义。如果您的上述示例中的placement.info是什么样的,如果VideoGamePart中有两个字段,您仍然可以单独放置它们吗? - Richard Garside
在这个答案的帮助下,发现了如何单独放置它们: stackoverflow.com/a/13809514/31569 - Richard Garside
您不需要使用“Part”作为后缀。部件名称和内容类型必须完全相同。 - Twisted Whisper
是的......您应该使用相同的名称,否则如果您想要更改某些内容,您将在以后编辑字段时遇到问题。 - manudea


答案:


实际上,您无法将字段附加到内容类型。当你将它附加到管理界面中的内容类型时,Orchard在幕后做了一些魔术来隐藏这个事实 - 它在内容类型中创建一个内容部分,与内容类型同名,然后附加该新内容部分的字段。

您可以通过管理UI附加字段,然后转到导入/导出,然后导出内容类型的元数据来验证这一点。

要通过迁移附加字段,请执行相同的操作。如果你没有一个附加字段的好地方的内容部分,我使用的约定是创建一个与内容类型相同的名称,后缀为“Part”的bug。所以我们说你的内容类型是“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()
);

所有字段都附加到零件,而不是类型,因此您可以使用此迁移方法自然地使用placement.info和模板控制放置,如果您通过UI定义字段,则可以。


14
2018-01-28 21:38



谢谢,这有助于它有意义。如果您的上述示例中的placement.info是什么样的,如果VideoGamePart中有两个字段,您仍然可以单独放置它们吗? - Richard Garside
在这个答案的帮助下,发现了如何单独放置它们: stackoverflow.com/a/13809514/31569 - Richard Garside
您不需要使用“Part”作为后缀。部件名称和内容类型必须完全相同。 - Twisted Whisper
是的......您应该使用相同的名称,否则如果您想要更改某些内容,您将在以后编辑字段时遇到问题。 - manudea