0

我有一个复杂的场景,我正在尝试使用 Orchard CMS 部件进行建模。

现在这里是简化版本,以明确我的问题。

我有一个部件名称,例如 PersonPart,它只有一个属性:名称。我有另一个包含人员角色的部分,将其命名为 PersonRolePart,并且只有一个属性 Role

在 Orchard,我创建了所有合适的管道(处理程序、驱动程序、视图......)

在迁移中,我创建了一个名为 Person 的新内容类型,其中包含两个部分。

ContentDefinitionManager.AlterTypeDefinition("Person", cfg => cfg
                       .WithPart("PersonPart")
                       .WithPart("PersonRolePart")
                       .WithPart("CommonPart")
                       .Creatable(false)  );

到目前为止一切顺利,我可以创建一个新人并编辑这两个部分。

我拥有的另一部分是绑定到上面定义的 PersonRolePart 之一的 ServicePart。

现在的问题:

出于报告目的,我需要通过 PersonRole 获取所有服务并获取属于该角色的人员详细信息,或者换句话说,获取上面定义的 Person 复合类型中使用的所有(确实只有一个)PersonPart。

怎么做?

现在在一个非果园的世界里,我会在 2 之间创建一个简单的 1:1 关系。

到目前为止,我的(失败的)尝试是将 PersonRoleRecord_Id 字段添加到 PersonPartRecord 并将 PersonRecord_Id 添加到 Person 角色......但我不知道如何在驱动程序或处理程序上设置正确的 id,因为两者都只看到自己的部分。

是否有可能从驱动程序中获取内容类型中其他伙伴部分的实例?

无法合并人员和角色。场景比这更复杂,我需要相同的人部分和 3 个不同的类似角色的部分用于不同的目的,我想避免重复普通人数据 3 次。

另一个想法是创建一个适当的处理程序,但我不知道如何为虚拟内容类型创建一个处理程序,就像我所做的那样。

4

1 回答 1

0

我已经设法使用解决另一个问题(验证)的另一个问题的建议来解决。 Orchard CMS - 确定模型在内容项驱动程序中是否有效

所以我的解决方案是为两者都添加一个处理程序并转换该部分并设置对另一部分的适当引用。

        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 是相同的,至少如果角色只是一种类型。我会看到我何时会创建更多类似角色的部分。

于 2013-10-09T10:26:46.600 回答