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



我最初的想法是创建一个 Umbraco 关系并将 Umbraco 成员关联到嵌套内容节点。 可悲的是,我发现这个表格帖子提出了一个类似的问题,正如你在马特·贝尔斯福德的第一个回应中看到的那样:

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

我确实找到了论坛帖子中讨论的问题/功能;但是,它只是将父信息添加到DetachedPublishedContent对象中,并不能解决我的问题。 在阅读了表单帖子以及Hendy Racher,Matt Bailsford和Lee Kelleher在github拉取请求中的对话后,我仍然不明白为什么Nested Content没有在Umbraco中创建节点

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

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

  2. 使用 Umbraco 多节点树选取器控件 - Hendy 和 Jeavon 在此论坛帖子中建议使用此控件,作为允许用户选择多个内容节点的一种方式。 不幸的是,走这条路需要用户首先创建"嵌套内容"节点。 然后,他们可以将这些"嵌套内容"节点与原始节点相关联。 我们非常喜欢嵌套内容控件的用户体验,它允许您在属性编辑器中动态创建节点。

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

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

在这一点上,我倾向于选择选项1,但我想知道选项3是否是一个更好的方向。 实际上,我不相信这是一个有人还没有解决的新问题,如果已经有一个类似的自定义属性编辑器,我讨厌创建另一个自定义属性编辑器。

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

问题是 -

正如你提到的 - 嵌套内容节点并不是真正的节点。我不认为解决您的问题的正确方法是尝试入侵嵌套内容以执行它实际上不是为了做的事情。

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

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

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

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

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

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

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


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

可以创建一个类似于普通节点选取器的选取器

,它只允许您像普通选取器一样浏览节点。选择节点时,它应该提取嵌套的内容节点并在 UI 中显示这些节点,而不仅仅是选择它。

但是,有一个小怪癖,即您基本上可以有多个属性将每个嵌套内容节点存储在一个内容项上 - 因此您需要一些不错的方法来在UI中处理此问题。

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

我不确定嵌套内容是否曾经实现过 GUID 唯一 ID/密钥功能 - Matt 和我去年讨论了它,我们尝试将其添加到项目所需的自定义版本中。如果它不存在,我建议你问马特他是否可以把它弄进去。它实质上只是为每个嵌套内容项提供一个"假"唯一 ID (GUID),您可以使用该 ID 将其与存储在属性中的其他嵌套内容项进行标识。(你必须问马特这个状态)

这样做将允许您(在您的成员上)有一个引用,您可以找到实际的内容节点,然后是存储内容的属性,最后是您选择的实际嵌套内容节点。

但是,您应该注意,这很容易中断,并且需要大量 null 处理:

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

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

最新更新