Фильтровать здравомыслие

Чтобы добавить язык в схему и выполнить локализацию, я использую 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',
}),

Если текущая страница находится на английском языке, я бы хотел видеть версию продукта на английском языке в раскрывающемся меню. Я предоставил язык для обеих схем, но не могу его отфильтровать. Может ли кто-нибудь помочь?


85
1

Ответ:

Решено

Похоже, проблема в вашем фильтре. Несколько замечаний:

  1. Параметры находятся не в том месте | В настоящее время ваши параметры применяются к массиву. Они должны быть вложены в ваш ссылочный тип, иначе он не будет иметь никакой функции.

  2. Множественные ограничения _type | В общем, я бы рекомендовал фильтровать тип только в одном месте. В ссылке на массив вы разрешаете пользователю выбирать как DogTreat, так и CatTreat. Затем в своем фильтре вы ограничиваете это специально для catTreat. Я бы удалил _type из фильтра и, если возможно, делал это только в ссылочном типе.

  3. Неправильная передача параметров в фильтр | Вы правильно выбираете язык документа с помощью let currentLanguage = document.language, но затем неправильно передаете его в фильтр. Вам не следует использовать строковую интерполяцию для передачи переменных, а лучше использовать объект params (как вы использовали для свойства 'type'). Способ ссылки на эти переменные также изменится на что-то вроде этого: return {filter: 'slug. текущий == $language', параметры: {язык: currentLanguage}}.

  4. Фильтрация неправильного значения | Я также только что настроил фильтрацию ссылок в зависимости от языка документа, и вы делаете это, затем фильтруя языковое свойство документа, а не 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',
    })