Orchard CMS:将列表内容部分连接到内容项

时间:2012-11-20 21:14:17

标签: orchardcms

我一直在努力解决我认为简单的问题。

我有一个名为Supplier的内容类型。该供应商的联系信息包含两个地址,一个用于通信地址,另一个用于访问地址。供应商还有几个地点,如位置北和位置南。位置也是地址。所以基本上我有一个内容项供应商,它有很多地址,所有地址都有自己的类型。

迁移:

        public int Create() {
        //Creating the Location contentrecord, contentpart and contenttype
        SchemaBuilder.CreateTable("LocationPartRecord", table => table
                                                                     .ContentPartRecord()
                                                                     .Column<int>("LocationsPartRecord_id")
            );

        ContentDefinitionManager.AlterPartDefinition("LocationPart", part => part
                                                         .Attachable(false)
                                                         .WithField("LocationName", f => f.OfType("TextField"))
                                                         .WithField("AddressLine1", f => f.OfType("TextField"))
                                                         .WithField("AddressLine2", f => f.OfType("TextField"))
                                                         .WithField("Zipcode", f => f.OfType("TextField"))
                                                         .WithField("City", f => f.OfType("TextField"))
                                                         .WithField("Country", f => f.OfType("TextField")));

        ContentDefinitionManager.AlterTypeDefinition("Location",
                                                     cfg => cfg
                                                                .WithPart("CommonPart")
                                                                .WithPart("LocationPart")
            );

        //Creating the Locations 'container' contentpart
        SchemaBuilder.CreateTable("LocationsPartRecord", table => table
                                                                      .ContentPartRecord()
            );

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

        //Creating the supplier. Specific supplier contentfields can be added later. Doing records, so I can add
        //datafields later that are not contentfields
        SchemaBuilder.CreateTable("SupplierPartRecord", table => table
                                                                     .ContentPartRecord());

        ContentDefinitionManager.AlterPartDefinition("SupplierPart", part => part
                                                                                 .Attachable(false)
            );

        ContentDefinitionManager.AlterTypeDefinition("Supplier", builder => builder
                                                                                .Creatable()
                                                                                .Draftable()
                                                                                .WithPart("CommonPart")
                                                                                .WithPart("TitlePart")
                                                                                .WithPart("BodyPart")
                                                                                .WithPart("AutoroutePart", partBuilder =>
                                                                                                           partBuilder.WithSetting("AutorouteSettings.AllowCustomPattern", "true")
                                                                                                               .WithSetting("AutorouteSettings.PatternDefinitions", "[{Name:'Supplier', Pattern: 'aanbieders/{Content.Slug}', Description: 'aanbieders/supplier-name'}]")
                                                                                                               .WithSetting("AutorouteSettings.DefaultPatternIndex", "0"))
                                                                                .WithPart("SupplierPart")
                                                                                .WithPart("LocationsPart"));

        return 1;
    }

型号: * LocationPartRecord和LocationPart *

public class LocationPartRecord:ContentPartRecord {
    public virtual LocationsPartRecord LocationsPartRecord { get; set; }
}

public class LocationPart:ContentPart<LocationPartRecord> {
    LocationsPartRecord LocationsPartRecord {
        get { return Record.LocationsPartRecord; }
        set { Record.LocationsPartRecord = value; }
    }
}

LocationsPartRecord和LocationsPart(容器)     公共类LocationsPartRecord:ContentPartRecord {

    public LocationsPartRecord()
    {
        Locations = new List<LocationPartRecord>();
    }

    [CascadeAllDeleteOrphan]
    public virtual IList<LocationPartRecord> Locations { get; set; }
}

public class LocationsPart:ContentPart<LocationsPartRecord> {

    public LocationsPart() {
        Locations = new List<LocationPart>();
    }

    public readonly LazyField<IList<LocationPart>> _locations = new LazyField<IList<LocationPart>>();

    public IList<LocationPart> Locations {
        get { return _locations.Value; }
        set { _locations.Value = value; }
    }
}

从这里我被困住了。我想看看创建新供应商时,我会看到一个包含供应商的所有内容项字段和位置列表的屏幕,可以创建,删除或更新位置。

我不需要拼写代码,但方向就足够了。我应该创建哪些驱动程序,控制器和视图。这仅适用于管理控制台。对于前端,需要显示位置而不进行编辑。

3 个答案:

答案 0 :(得分:0)

我认为没有任何方法可以获得您没有自定义编码的功能。正如您所建议的那样,评论模块可能是一个很好的复制示例。评论模块中的控制器仅用于管理其管理页面中的所有注释,与其所属的内容项分开。仍然通过驱动程序和处理程序提供注释的编辑/显示。

使用评论模块类比:

CommentsPart = AddressesPart - 这将添加到您的供应商内容类型

CommentPart = AddressPart - 这将添加到您的地址内容类型

您可以删除管理评论所包含的许多额外功能,只需复制这两部分的驱动程序,处理程序,视图和模型。

我见过一些图库模块可能允许你通过管理界面建立这些关系,但我自己没有用过: http://gallery.orchardproject.net/List/Modules/Orchard.Module.Downplay.Mechanics

答案 1 :(得分:0)

地址不应该是一个部分,它应该是一个字段。这样,您可以拥有多个,并且每个都可以命名。

答案 2 :(得分:0)

不知道这是否有用(并且该网站似乎已关闭 - 但如果您有耐心加载,Google会有缓存版本),但有一个关于您的情况的好博客。这是Skywalkers出色的Web Shop系列。我相信第8部分包含与多个地址相关的代码(使用地址和地址)。这似乎涉及到您的问题,代码可能就是您所需要的。

如果您无法访问该网站,则代码中还有一个CodePlex存储库。此外,Bertrand的Nwazet Commerce模块可能有类似的代码。