Content management system 如何创建自定义内容类型作为Orchard模块的一部分?

Content management system 如何创建自定义内容类型作为Orchard模块的一部分?,content-management-system,orchardcms,Content Management System,Orchardcms,我想在Orchard 1.6中创建一个自定义包内容类型。我已经有了一个内容部分,它代表了一个包的整个db记录和UI,但是现在我想知道我是否正确地处理了这个问题 在我看来,下一步是使用Orchard dashboard创建新的内容类型,并将自定义内容部分添加到该类型中。但是,内容类型是Orchard内部的,依赖于托管内容部分的“外部”模块。如何使我的内容类型仅在启用模块时可用?为方便起见,您可以在模块中的迁移过程中创建内容类型。这将仅在启用时运行。它看起来像这样 //Inside of yo

我想在Orchard 1.6中创建一个自定义包内容类型。我已经有了一个内容部分,它代表了一个包的整个db记录和UI,但是现在我想知道我是否正确地处理了这个问题


在我看来,下一步是使用Orchard dashboard创建新的内容类型,并将自定义内容部分添加到该类型中。但是,内容类型是Orchard内部的,依赖于托管内容部分的“外部”模块。如何使我的内容类型仅在启用模块时可用?

为方便起见,您可以在模块中的迁移过程中创建内容类型。这将仅在启用时运行。它看起来像这样

   //Inside of your migration file... 
   public int UpdateFrom1(){
     ContentDefinitionManager.AlterTypeDefinition("Package", cfg=> cfg
        .Creatable()
        .WithPart("YourCustomPart")
        .WithPart("CommonPart")
        .WithPart("Whatever other parts you want..."));
        return 2;
   }
禁用模块时删除此内容类型将是一个棘手的部分,因为用户可能会有点意外。也许“包”是一种他们仍然想使用的类型,附带不同的部件。此外,如果他们在不禁用的情况下手动删除您的模块,您就无法编写代码来响应该事件。据我所知,唯一可靠的是IFeatureEventHandler。这将允许您删除您的内容类型,如果他们禁用管理中的模块

public PackageRemover : IFeatureEventHandler {
  private readonly IContentDefinitionManager _contentDefinitionManager;
  public PackageRemover(IContentDefinitionManager contentDefinitionManager){
    _contentDefinitionManager = contentDefinitionManager;
  }

  public void Installed(Feature feature){}
  public void Enabling(Feature feature){}
  public void Enabled(Feature feature){}
  public void Disabling(Feature feature){
    _contentDefinitionManager.DeleteTypeDefinition("Package");
  }
  public void Disabled(Feature feature){}
  public void Uninstalling(Feature feature){}
  public void Uninstalled(Feature feature){}
}

谢谢你,布兰登。我可以从您的第一段代码摘录中假设
AlterTypeDefinition
将添加不存在的类型吗?