Headless cms Gentics Mesh-多语言支持-节点列表中的跨语言-GraphQL查询

Headless cms Gentics Mesh-多语言支持-节点列表中的跨语言-GraphQL查询,headless-cms,gentics-mesh,Headless Cms,Gentics Mesh,Gentics网格版本:v1.5.1 简介: 假设我们有一个模式A,其字段类型为:list,列表类型为:node,允许的模式为:B(参见(1)) 已在语言EN和DE中创建了B节点的实例(b1 EN)和(b1 DE) 已使用语言EN创建了B节点的实例(b2 EN) 已使用DE语言创建了节点实例(a1 DE),并且b1 DE和b2 EN被添加到a1的节点列表(Bs)中 因此,在Gentics Mesh CMS中选择de语言时,节点a1 de(de)有一个包含两个节点的列表b1 de,b2 EN

Gentics网格版本:v1.5.1

简介:

假设我们有一个模式A,其字段类型为:list,列表类型为:node,允许的模式为:B(参见(1))

  • 已在语言ENDE中创建了B节点的实例(b1 EN)和(b1 DE
  • 已使用语言EN创建了B节点的实例(b2 EN
  • 已使用DE语言创建了节点实例(a1 DE),并且b1 DEb2 EN被添加到a1的节点列表(Bs)中
因此,在Gentics Mesh CMS中选择de语言时,节点a1 dede)有一个包含两个节点的列表b1 deb2 EN

应用以下GraphQL查询时:

{
  node(path: "/a1-DE") {
      ... on A {
        path
        uuid
        availableLanguages
        fields {
          Bs {
            ... on B {
              path
              fields {
                id
              }
            }
          }
       }
    }
  }
}
结果是:

{
  "data": {
    "node": {
      "path": "/a1-DE",
      "uuid": "30dfd534cdee40dd8551e6322c6b1518",
      "availableLanguages": [
        "de"
      ],
      "fields": {
        "Bs": [
          {
            "path": "/b1-DE",
            "fields": {
              "id": "b1-DE"
            }
          },
          {
            "path": null,
            "fields": null
          }
        ]
      }
    }
  }
}
问题:

为什么结果没有在节点列表中显示b2 EN节点?问错了吗?我希望得到的结果是节点的默认语言版本(b2 EN),因为尚未提供b2 DE。因此,预期的结果是:

{
  "data": {
    "node": {
      "path": "/a1-DE",
      "uuid": "30dfd534cdee40dd8551e6322c6b1518",
      "availableLanguages": [
        "de"
      ],
      "fields": {
        "Bs": [
          {
            "path": "/b1-DE",
            "fields": {
              "id": "b1-DE"
            }
          },
          {
            "path": "/b2-EN",
            "fields": {
              "id": "b2-EN"
            }
          }
        ]
      }
    }
  }
}
在文件(2)中:

如果找不到其他匹配的内容,将应用对配置的默认语言的回退。如果此操作也失败,则将返回Null

有人能启发我吗

(1) :模式


(2) 通过GraphQL加载节点时,存在一些已知问题和不一致的行为。见本期:

在您的情况下,查询的节点列表将始终使用配置的默认语言(在
mesh.yml
中)。在您的情况下,这似乎是
de
。这就是为什么纯英语节点不会产生任何结果

在修复此问题之前,您可以通过加载节点列表的所有语言来解决此问题:

{
  node(path: "/a1-DE") {
      ... on A {
        path
        uuid
        availableLanguages
        fields {
          Bs {
            ... on B {
              languages {
                path
                language
                fields {
                  id
                }
              }
            }
          }
       }
    }
  }
}

您将看到节点列表中所有语言的内容。这意味着您必须在收到响应后在代码中筛选所需的语言。

之所以使用“de”,是因为“en”是mesh.yml文件中我的默认语言(defaultLanguage:“en”)。这就是为什么我没有得到节点的“en”版本。通过您的查询,我得到:“fields”:{“Bs”:{“languages”:{“path”:“/b1 en”,“language”:“en”},{“path”:“/b1 DE”,“language”:“DE”}]},{“语言”:[{“路径”:“/b2 EN”,“语言”:“EN”}]}}问题是:从架构上讲,如果未创建查询语言中的节点,Gentics Mesh API应该或不应该返回默认语言节点版本。在上面的示例中,Gentics Mesh是否应该返回{“path”:“/b2 EN”,“fields”:{“id”:“b2 EN”}}?您可以在这里看到节点引用列表的工作方式:对于父节点,您使用路径获取节点。路径是特定于语言的,因此您将始终使用与路径匹配的语言获取节点。节点引用列表实际上查找与最初查询的节点具有相同语言的节点。这就是为什么您会在语言
de
中获得节点。我们希望对此进行更改以减少混淆。您的答案非常清楚,我确实了解到路径与语言版本密切相关,因为标识符是唯一的,并且特定于特定节点的语言版本。在我的示例中,a1 DE是节点DE版本的ID。尽管如此,我不明白为什么在UI中我可以分配b2 EN(其中DE不存在),当我编写查询以获取DE版本时,我会得到这个不明确的结果。正如你在最初的回答中提到的。不过,对这个问题的解释并不容易。。。
{
  node(path: "/a1-DE") {
      ... on A {
        path
        uuid
        availableLanguages
        fields {
          Bs {
            ... on B {
              languages {
                path
                language
                fields {
                  id
                }
              }
            }
          }
       }
    }
  }
}