0

我一直在努力解决我认为很简单的事情。

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

移民:

        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; }
    }
}

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

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

4

3 回答 3

0

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

使用 Comments 模块类比:

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

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

你可以去掉很多用于管理评论的额外功能,只复制这两个部分的驱动程序、处理程序、视图和模型。

我已经看到一些画廊模块可以让您通过管理界面建立这些关系,但是我自己没有使用它:http: //gallery.orchardproject.net/List/Modules/Orchard.Module.Downplay.Mechanics

于 2012-11-20T22:44:46.160 回答
0

不知道这是否会有所帮助(并且该站点似乎已关闭 - 但如果您有耐心加载它,Google 有一个缓存版本),但有一个关于您的情况的好博客。它是天行者优秀的网上商店系列。我相信第 8 部分包含与多个地址相关的代码(使用地址和地址)。这似乎涉及到你的问题,代码可能是你需要的。

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

于 2012-12-05T12:50:27.087 回答
0

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

于 2012-11-21T00:40:21.720 回答