【问题标题】:Hierarchical menu with Contentful具有内容的分层菜单
【发布时间】:2017-10-31 07:36:35
【问题描述】:

Contentful 有一个“链接”的概念,它可以指向许多对象或一个对象。但是,如果不加倍工作(即指定每个对象的子对象和父对象),我找不到一种方法来模拟反向关系。

我想使用 Contentful 来支持这样的简单导航:

  • 菜单项 1

    • 子菜单项 1
    • 子菜单项 2
    • 子菜单项 3
  • 菜单项 2

    • 子菜单项 4
    • 子菜单项 5
    • 子菜单项 6
      -- 子子菜单项1

链接可能类似​​于/<parent.slug>/<child.slug>/<child.slug>/

我可以通过遍历父关系来找到要呈现的页面条目,以确保我得到一个带有 slug 的页面,以及一个带有特定 slug 的父级。

但是,除非您在对象中包含“children”字段,否则很难在不使用多个 API 调用的情况下呈现子菜单项 - 这很容易出错和不一致。

【问题讨论】:

  • 如果我说菜单中的每个项目都有对其父项的引用,但每个父项都不知道它的子项,我是否理解正确?
  • 是的,我“通常”如何构建树形菜单结构只是具有父关系的子对象,然后能够使用自动反向关系遍历树 - 例如使用 Django ORM,这很简单。

标签: contentful


【解决方案1】:

如果您的项目只有子关系,您可以利用包含概念。只需获取最下方的子项并将 includes 参数设置为足够高的值(最大值为 10),Contentfuls API 将在单个 API 调用中包含所有引用的内容。

您可以在此处阅读有关包含的更多信息:https://www.contentful.com/developers/docs/references/content-delivery-api/#/reference/links

【讨论】:

  • 是的 - 这将允许构建一个菜单,但据我所知,不允许 API 调用基于父对象 slug 检索单个子对象。例如/grandparent/parent/child/ - 如果我使用大的 include 值检索整个树,我可以在内存中执行此操作,这对于几十页可能没问题,但几 1000?
  • 如果您的菜单中有数以千计的项目,则无论您使用哪种方式,都需要多次调用 API。对于这么大的菜单,也许某种缓存机制是合适的。
【解决方案2】:

是的,我们遇到了同样的问题。我们有一个 Page 模型,带有一个名为“parentPage”的 refLink。我们的中间件对 CF 进行 1 次调用以获取所有页面并在内存中构建站点树模型。

从这个模型中,我们有获取子节点和获取 URL slug 的方法。

【讨论】:

  • 我将把它标记为正确答案,因为这也是我们解决它的方法 - 将所有页面抓取到内存中并从那里开始。虽然我认为目前还没有更好的方法,但我觉得它的效率有点低。
  • 同意,但是 CF 并不是设计为像(Wordpress、Sitecore、AEM、Umbraco 等)那样以页面为中心的 CMS,它更像是 Parse 或 Firebase,上面有一个可爱的 UI一个 DB + API。我想引入 Pages 的概念来定义一个站点,因为这是作者倾向于知道的。 + 添加页面,将内容放在页面上很容易。
  • 如何填写 parentPage 的值? @WillHancock 是手动完成的吗?
  • 只是为了记录在这个旧讨论中,parentPage 将是一个 Reference 类型的字段,仅限于对 Page 内容类型项目的引用。
猜你喜欢
  • 2023-02-24
  • 1970-01-01
  • 2016-12-10
  • 2023-03-14
  • 2011-09-17
  • 1970-01-01
  • 2017-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多