Чтобы добавить язык в схему и выполнить локализацию, я использую documentInternationalization из @sanity/document-internationalization. Когда я использовал другую схему в своей родительской схеме, я хотел отфильтровать, но не мог понять, как это сделать.
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',
}),
Если текущая страница находится на английском языке, я бы хотел видеть версию продукта на английском языке в раскрывающемся меню. Я предоставил язык для обеих схем, но не могу его отфильтровать. Может ли кто-нибудь помочь?
Похоже, проблема в вашем фильтре. Несколько замечаний:
Параметры находятся не в том месте | В настоящее время ваши параметры применяются к массиву. Они должны быть вложены в ваш ссылочный тип, иначе он не будет иметь никакой функции.
Множественные ограничения _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',
})