将嵌套内容节点与Umbraco成员关联的最佳方法是什么

时间:2016-07-08 22:48:15

标签: c# sql-server umbraco umbraco7

我最初的想法是创建一个Umbraco Relation并将Umbraco成员关联到嵌套内容节点。可悲的是,我发现了form post asking a similar question,你可以在Matt Bailsford的第一个回复中看到:

  

不幸的是,嵌套内容不能具有ID值,因为它们不存在

我确实找到了论坛帖子中讨论的issue/feature;但是,它只是将父信息添加到DetachedPublishedContent对象,并没有解决我的问题。在阅读了Hendy Racher中的表单帖子以及Matt BailsfordLee Kellehergithub pull request的对话后,我仍然不明白为什么嵌套内容不会创建Umbraco中的一个节点

所以基本上我需要在属性字段中将嵌套内容节点创建为Umbraco节点并将然后存储为JSON字符串。我认为有几种方法可以实现:

  1. 为Umbraco Backoffice创建自定义属性编辑器 - 我将从嵌套内容的副本开始,添加代码以创建节点并在将节点保存为JSON字符串之前附加它。

  2. 使用Umbraco Multinode Treepicker control - 此控件由Hendy和Jeavon在this forum post中建议,以允许用户选择多个内容节点。不幸的是,走这条路线需要用户首先创建“嵌套内容”节点。然后,他们可以将这些“嵌套内容”节点与原始节点相关联。我们非常喜欢嵌套内容控件的用户体验,它允许您在属性编辑器中动态创建节点。

  3. 找到将成员关联到“嵌套内容”节点的方法 - 此选项要求我在顶级节点与其各自的“嵌套内容”节点之间存储关联Umbraco的一名成员。尝试走这条路时会想到两个问题:

    1. 如何以标准的Umbraco方式将“嵌套内容”节点与成员关联? - 我立即想到在数据库中创建一个链接表,但据我所知,这不是标准的Umbraco方式。关于在Umbraco内部做这件事的最佳方式,我仍然很模糊。
    2. 有没有办法唯一地识别“嵌套内容”节点? - 我意识到根据我在上面找到的拉取请求设置了排序顺序值但是如果用户重新排序嵌套内容项是否会将“嵌套内容”节点更改为成员关联?
  4. 此时,我倾向于选择选项1 ,但我想知道选项3 是否是一个更好的方向。实际上,我不相信这是一个有人尚未解决的新问题,我讨厌创建另一个自定义属性编辑器,如果有一个就像它已经存在的那样。

    因此,如果您知道解决此问题的更好方法,请与我们联系。

1 个答案:

答案 0 :(得分:1)

问题是 - 正如你所提到的 - 嵌套内容节点并不是真正的真实节点。我不认为解决问题的正确方法是尝试将嵌套内容破解为执行真正无法创建的内容。

在嵌套内容节点上创建节点并引用它们的问题是,Umbraco中的每个节点基本上都需要“生存”。

您可以选择说节点位于嵌套的父节点下,但是如何区分嵌套节点和实际子节点 - 这将需要另一个黑客,因为它实际上正在解决节点的意义在Umbraco核心构建和处理。

即使你确实设法让这个工作,我怀疑你会有很多事情需要处理才能让它像嵌套内容目前一样好用:

  • 您可以以某种方式将嵌套内容编辑器中的每个节点包装成一个对象,以便能够存储元数据,例如它所连接的节点ID,以及sortOrder重新排序所有嵌套内容节点时在那里。

(编辑:我认为它实际上已经在这里存储了某种包装器对象,但是您必须更改此处的逻辑以实际处理对另一个节点的引用,而不是仅仅反序列化存储在此处的json,作为节点)

  • 您还必须手动挂钩事件,确保您在父节点上执行的实际编辑实际上最终被持久保存到嵌套节点。
  • 删除嵌套内容节点或具有任何嵌套节点的父节点 - 您必须处理删除任何孤立节点。

很可能有很多我错过的东西,但我的观点是 - 尝试这样做会有很多麻烦。

我认为如果你真的需要这样做,你应该考虑另一种方法:

可以创建类似于普通节点选择器的选择器,它只允许您像普通选择器那样浏览节点。当您选择一个节点而不是仅选择它时,它应该获取嵌套的内容节点并在UI中显示它们。

然而,有一点很奇怪,你可能实际上有多个属性将每个嵌套内容节点集存储在一个内容项上 - 所以你需要一些很好的方法在UI中处理它。

当您选择一个或多个嵌套节点时,您的选择器将存储的内容类似于[guid-of-the-real-node]_[propertyAlias]_[guid-of-nested-content-item]

我不确定嵌套内容是否已经实现了GUID唯一ID /密钥功能 - 马特和我在去年的某个时候进行了讨论,我们尝试将其添加到项目所需的自定义构建中。如果不存在,我会建议你询问Matt是否可以进入。它实际上只是给每个嵌套内容项一个“假的”唯一ID(GUID),您可以使用它从存储的其他嵌套内容项中识别它在该物业。 (你必须向Matt询问此事的状态)

执行此操作将允许您(在您的成员上)有一个引用,您可以使用该引用查找实际内容节点,然后是存储内容的属性,最后是您选择的实际嵌套内容节点。

但是你应该注意到非常容易破坏,需要大量的空处理:

  • 如果您更改属性的属性别名,则您将在父级中存储嵌套内容,它将丢失引用。
  • 如果删除存储嵌套项目的内容项目,则挑选的项目不再存在,并且您的成员的选择器中缺少引用(需要空值处理)
  • 如果删除嵌套的内容项 - 与上述相同。您的选择器中缺少参考。

除了上面的解决方案之外,我现在还没有真正看到另外一种方法来满足您的要求。