我有一个复杂的场景,我正在尝试使用Orchard CMS部件进行建模。
现在,这是简化版本,以澄清我的问题。
我有一个部件名称,例如,PersonPart只有一个属性:Name。 我有另一个包含person角色的部分,将其命名为PersonRolePart并且只有一个属性Role
在Orchard,我创建了所有合适的管道(处理程序,驱动程序,视图......)
在迁移中,我创建了一个名为Person的新内容类型,其中包含两部分。
ContentDefinitionManager.AlterTypeDefinition("Person", cfg => cfg
.WithPart("PersonPart")
.WithPart("PersonRolePart")
.WithPart("CommonPart")
.Creatable(false) );
到目前为止,我可以创建一个新人并编辑这两个部分。
我拥有的另一个部分是ServicePart,它绑定到上面定义的PersonRoleParts之一。
现在的问题是:
出于报告目的,我需要通过PersonRole获取所有服务并获取属于该角色的人员详细信息,或者换句话说,获取在上面定义的Person复合类型中使用的所有(仅一个确实)PersonPart。
怎么做?
现在在非果园世界中,我会在2之间建立简单的1:1关系。
到目前为止我的(失败)尝试是将PersonRoleRecord_Id字段添加到PersonPartRecord,将PersonRecord_Id添加到Person角色......但我不知道如何在驱动程序或处理程序上设置更正id,因为两者都只看到自己的部分。
是否可以从驱动程序获取内容类型中其他人员部分的实例?
无法合并人员和角色。场景比这更复杂,我需要相同的Person Part和3个不同的角色类型的部分用于不同的目的,我想避免重复的普通人数据3次。
另一个想法是创建一个合适的处理程序,但我不知道如何为我所做的虚拟内容类型创建一个Handler。
答案 0 :(得分:0)
我设法解决了另一个解决不同问题(验证)问题的建议。 Orchard CMS - determining if Model is valid in Content Item Driver
所以我的解决方案是为两者添加一个处理程序并转换部件并将相应的引用设置为另一部分。
OnPublishing<PersonPart>((context, part) =>{
var person = part.As<PersonPart>();
var role= part.As<PersonRolePart>();
if (person != null && role != null) {
if (role.Person == null) {
role.Person = person.Record;
}
}
});
在这个特定的情况下,因为它是一个1:1的关系所以我只使用那个组合部分,两个id是相同的,至少如果角色只是一种类型。 我将看到何时会创建更多类似角色的部分。