我一直在努力解决我认为简单的问题。
我有一个名为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; }
}
}
从这里我被困住了。我想看看创建新供应商时,我会看到一个包含供应商的所有内容项字段和位置列表的屏幕,可以创建,删除或更新位置。
我不需要拼写代码,但方向就足够了。我应该创建哪些驱动程序,控制器和视图。这仅适用于管理控制台。对于前端,需要显示位置而不进行编辑。
答案 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模块可能有类似的代码。