Разработка кастомных схем (Schemas) Sanity

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Разработка кастомных схем (Schemas) Sanity
Простая
~2-3 рабочих дня
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Разработка кастомных схем (Schemas) Sanity

Схема в Sanity — TypeScript-описание структуры документа. Поля, типы, валидация, группы — всё в коде. Sanity Studio генерирует форму редактора автоматически из схемы.

Типы документов и их регистрация

// sanity/schema.ts
import { postType } from './schemas/postType'
import { authorType } from './schemas/authorType'
import { categoryType } from './schemas/categoryType'
import { productType } from './schemas/productType'
import { siteSettingsType } from './schemas/siteSettingsType'

export const schema = {
  types: [postType, authorType, categoryType, productType, siteSettingsType],
}

Полная схема товара

// schemas/productType.ts
import { defineType, defineField, defineArrayMember } from 'sanity'

export const productType = defineType({
  name: 'product',
  title: 'Товар',
  type: 'document',
  groups: [
    { name: 'details', title: 'Данные', default: true },
    { name: 'media', title: 'Медиа' },
    { name: 'seo', title: 'SEO' },
  ],
  fields: [
    defineField({
      name: 'name',
      title: 'Название',
      type: 'string',
      group: 'details',
      validation: rule => rule.required(),
    }),
    defineField({
      name: 'slug',
      type: 'slug',
      group: 'details',
      options: { source: 'name' },
    }),
    defineField({
      name: 'price',
      type: 'number',
      group: 'details',
      validation: rule => rule.required().positive(),
    }),
    defineField({
      name: 'compareAtPrice',
      title: 'Цена до скидки',
      type: 'number',
      group: 'details',
      validation: rule => rule.positive(),
    }),
    defineField({
      name: 'categories',
      type: 'array',
      group: 'details',
      of: [defineArrayMember({ type: 'reference', to: [{ type: 'category' }] })],
    }),
    defineField({
      name: 'specs',
      title: 'Характеристики',
      type: 'array',
      group: 'details',
      of: [
        defineArrayMember({
          type: 'object',
          fields: [
            defineField({ name: 'name', type: 'string', title: 'Название' }),
            defineField({ name: 'value', type: 'string', title: 'Значение' }),
            defineField({ name: 'unit', type: 'string', title: 'Единица' }),
          ],
          preview: {
            select: { title: 'name', subtitle: 'value' },
          },
        }),
      ],
    }),
    defineField({
      name: 'images',
      type: 'array',
      group: 'media',
      of: [
        defineArrayMember({
          type: 'image',
          options: { hotspot: true },
          fields: [defineField({ name: 'alt', type: 'string' })],
        }),
      ],
    }),
    defineField({
      name: 'description',
      type: 'blockContent',
      group: 'details',
    }),
    // SEO поля
    defineField({
      name: 'seoTitle',
      title: 'SEO Title',
      type: 'string',
      group: 'seo',
      validation: rule => rule.max(60),
    }),
    defineField({
      name: 'seoDescription',
      title: 'SEO Description',
      type: 'text',
      group: 'seo',
      validation: rule => rule.max(160),
    }),
    // Статус
    defineField({
      name: 'status',
      type: 'string',
      options: {
        list: [
          { title: 'Активен', value: 'active' },
          { title: 'Архив', value: 'archived' },
          { title: 'Черновик', value: 'draft' },
        ],
        layout: 'radio',
      },
      initialValue: 'active',
    }),
  ],
})

Portable Text (richtext) схема

// schemas/blockContent.ts
import { defineType, defineArrayMember } from 'sanity'

export const blockContentType = defineType({
  name: 'blockContent',
  title: 'Block Content',
  type: 'array',
  of: [
    defineArrayMember({
      type: 'block',
      styles: [
        { title: 'Normal', value: 'normal' },
        { title: 'H2', value: 'h2' },
        { title: 'H3', value: 'h3' },
        { title: 'Quote', value: 'blockquote' },
      ],
      marks: {
        decorators: [
          { title: 'Bold', value: 'strong' },
          { title: 'Italic', value: 'em' },
          { title: 'Code', value: 'code' },
        ],
        annotations: [
          {
            name: 'link',
            type: 'object',
            fields: [
              defineField({ name: 'href', type: 'url' }),
              defineField({ name: 'blank', type: 'boolean', title: 'Open in new tab' }),
            ],
          },
        ],
      },
    }),
    // Встроенные изображения
    defineArrayMember({
      type: 'image',
      options: { hotspot: true },
      fields: [
        defineField({ name: 'alt', type: 'string' }),
        defineField({ name: 'caption', type: 'string' }),
      ],
    }),
    // Кастомный блок — цитата с автором
    defineArrayMember({
      type: 'object',
      name: 'callout',
      title: 'Callout',
      fields: [
        defineField({ name: 'text', type: 'text' }),
        defineField({
          name: 'type',
          type: 'string',
          options: { list: ['info', 'warning', 'tip'], layout: 'radio' },
        }),
      ],
    }),
  ],
})

Singleton документ (настройки сайта)

// schemas/siteSettingsType.ts
export const siteSettingsType = defineType({
  name: 'siteSettings',
  title: 'Настройки сайта',
  type: 'document',
  fields: [
    defineField({ name: 'siteName', type: 'string', validation: r => r.required() }),
    defineField({ name: 'logo', type: 'image' }),
    defineField({ name: 'favicon', type: 'image' }),
    defineField({
      name: 'socialLinks',
      type: 'array',
      of: [defineArrayMember({
        type: 'object',
        fields: [
          defineField({ name: 'platform', type: 'string' }),
          defineField({ name: 'url', type: 'url' }),
        ],
      })],
    }),
  ],
  preview: { select: { title: 'siteName', media: 'logo' } },
})

Сроки

Разработка 4–6 схем с Portable Text, связями и валидацией — 2–3 дня.