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

What is the best way to associate a Nested Content node to an Umbraco Member

我最初的想法是创建一个 Umbraco Relation and associate the Umbraco Member to the Nested Content node. Sadly, I found this form post asking a similar question,正如您在 Matt Bailsford 的第一反应中看到的那样:

Unfortunately nested content can't have an ID value as they don't truely exist

我确实找到了 issue/feature that was discussed in the forum post; however, it just adds parent information to the DetachedPublishedContent object and doesn't solve my issue. After reading the form post and the conversations of Hendy Racher, Matt Bailsford and Lee Kelleher in the github pull request,但我仍然不明白为什么嵌套内容不 在 Umbraco 中创建节点

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

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

  2. 使用 Umbraco Multinode Treepicker control - This control was suggested by Hendy and Jeavon in this forum post 允许用户 select 多个内容节点。不幸的是,走这条路需要用户先创建 "nested content" 节点。然后他们可以将那些 "nested content" 节点与原始节点相关联。我们非常喜欢嵌套内容控件的用户体验,它允许您在 属性 编辑器中动态创建节点。

  3. 找到一种方法将成员关联到 "Nested Content" 节点 - 此选项需要我存储顶级节点和它是 Umbraco 中成员的相应 "nested content" 节点。尝试走这条路时会想到两个问题:

    1. 我应该如何以标准的 Umbraco 方式将 "nested content" 节点关联到成员? - 我立即想到创建一个 link table 在数据库中,但据我所知,这不是标准的 Umbraco 方式。我仍然不清楚在 Umbraco 中执行此操作的最佳方法。
    2. 有没有办法唯一标识 "nested content" 节点? - 我意识到根据我在上面找到的拉取请求设置了一个排序顺序值但是如果用户重新排序嵌套的内容项,它会将 "nested content" 节点更改为成员关联吗?

在这一点上,我倾向于使用 选项 1,但我想知道 选项 3 是否是更好的方向。事实上,我不认为这是一个尚未有人解决的新问题,而且我讨厌创建另一个自定义 属性 编辑器,如果已经有类似的编辑器的话。

因此,如果您知道解决此问题的更好方法,请告诉我。

问题是 - 正如您提到的那样 - 嵌套内容节点并不是真正的真实节点。我不认为解决您的问题的正确方法是尝试破解嵌套内容来做它实际上不是为了做的事情。

关于创建节点并在嵌套内容节点上引用它们的问题在于,基本上 Umbraco 中的每个节点都需要 "live" 某处。

你可以选择说一个节点位于它嵌套的父节点之下,但是你将如何区分嵌套节点和实际子节点——这需要另一个 hack,因为它实际上是围绕节点如何工作的旨在在 Umbraco 核心中构建和处理。

即使您确实设法让它工作,我怀疑您需要处理很多事情才能使其真正像嵌套内容当前那样工作:

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

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

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

我很可能遗漏了很多东西,但我的意思是 - 尝试这样做会遇到很多麻烦。


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

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

然而,有一个小怪癖,您实际上可以拥有多个属性,将它们的每组嵌套内容节点存储在一个内容项上 - 因此您需要一些很好的方法来处理 UI 中的这个问题。

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

我不确定嵌套内容是否实现了 GUID 独特的 ID/key 功能 - Matt 和我去年讨论过它,我们尝试在自定义中添加它构建我需要的项目。如果它不存在,我建议你问问 Matt,他是否可以把它放进去。它基本上只是给每个嵌套的内容项一个 "fake" 唯一的 ID (GUID),你可以用它来从 属性 中存储的其他嵌套内容项中识别它。 (你得问马特关于这个的状态)

这样做可以让您(在您的会员上)有一个参考,让您可以找到实际的内容节点,然后是存储内容的 属性,最后是实际的嵌套内容节点已选

但是您应该注意,这 非常 容易出错并且需要大量的 null 处理:

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

除了上述解决方案之外,目前我真的没有看到其他方法可以满足您的要求。