为了向架构添加语言并进行本地化,我使用“@sanity/document-internationalization”中的 documentInternationalization。 当我在父模式中使用另一个模式时,我想进行过滤,但我不知道如何进行过滤。
defineField({ name: 'product',
type: 'array',
of: [{type: 'reference', to: [{type: 'dogTreat'}, {type: 'catTreat'}]}],
options: {
filter: ({ document }) => {
let currentLanguage = document.language;
return {
filter: `_type == "catTreat" && slug.current == '${currentLanguage}' `,
params: {
type:'catTreat'},
}
}
},
group: 'products',
}),
如果当前页面是 en-US,我想在下拉菜单中查看产品的 en-US 版本。我已为这两种模式提供了语言,但无法对其进行过滤。有人可以帮忙吗?
看来是您的过滤器有问题。需要注意的一些事项:
选项位置错误 |目前您的选项正在应用于阵列。它们应该嵌套在您的引用类型中,否则它没有任何功能。
多重_type限制 |一般来说,我只建议在一个位置过滤类型。在您的数组引用中,您允许用户选择dogTreat 和catTreat。然后,在您的过滤器中,您将其专门限制为 catTreat。如果可能的话,我会从过滤器中删除 _type 并仅在引用类型中执行此操作。
错误地将参数传递给过滤器 |您可以使用 let currentLanguage = document.language 正确获取文档的语言,但随后错误地将其传递给过滤器。您不应该使用字符串插值来传递变量,而应该使用 params 对象(就像您用于“type”属性一样)。然后您引用该变量的方式也会更改为如下所示: return {filter: 'slug.当前 == $language',参数:{语言:currentLanguage}}。
过滤错误值 |我还刚刚根据文档语言设置了引用过滤,然后您可以通过过滤文档的语言属性(而不是 slug.current)来完成此操作。
您的字段应如下所示:
defineField({
title: 'Products',
name: 'product',
type: 'array',
of: [
defineArrayMember({
type: 'reference',
to: { type: 'catTreat' },
options: {
filter: ({ document }) => {
const { language } = document
if (language) {
return {
filter: 'language == $language',
params: {
language: language,
},
}
}
return {}
},
},
}),
],
group: 'products',
})