Настройка конфигурации коллекций Decap CMS
Коллекции — центральный элемент config.yml. Каждая коллекция определяет тип контента: где хранятся файлы, как они называются, какие поля доступны редактору. Правильно настроенные коллекции — разница между CMS, которой удобно пользоваться, и набором непонятных полей.
Два типа коллекций
Folder collection — список однотипных записей (статьи, кейсы, вакансии):
collections:
- name: blog
label: Блог
folder: content/blog
create: true
delete: true
slug: "{{slug}}"
fields:
- { label: Заголовок, name: title, widget: string }
- { label: Контент, name: body, widget: markdown }
Files collection — фиксированный набор страниц (главная, о нас, контакты):
- name: pages
label: Страницы
files:
- label: Главная страница
name: home
file: content/home.yaml
fields:
- { label: Заголовок hero, name: hero_title, widget: string }
- { label: Подзаголовок, name: hero_subtitle, widget: text }
- label: О компании
name: about
file: content/about.md
fields:
- { label: Заголовок, name: title, widget: string }
- { label: Контент, name: body, widget: markdown }
Виджеты полей
Полный набор для реальных проектов:
fields:
# Базовые
- { label: Строка, name: title, widget: string, required: true }
- { label: Текст, name: description, widget: text }
- { label: Число, name: order, widget: number, value_type: int, default: 0 }
- { label: Булево, name: featured, widget: boolean, default: false }
- { label: Дата, name: date, widget: datetime, format: "YYYY-MM-DD" }
# Выбор из списка
- label: Категория
name: category
widget: select
options:
- { label: Новости, value: news }
- { label: Кейсы, value: cases }
- { label: Аналитика, value: analytics }
# Медиафайл
- { label: Обложка, name: cover, widget: image, required: false }
# Markdown-редактор
- label: Контент
name: body
widget: markdown
modes: [rich_text, raw]
# Список строк
- { label: Теги, name: tags, widget: list, required: false }
# Вложенный объект
- label: SEO
name: seo
widget: object
collapsed: true
fields:
- { label: Meta title, name: title, widget: string, required: false }
- { label: Meta description, name: description, widget: text, required: false }
- { label: OG Image, name: og_image, widget: image, required: false }
# Список объектов
- label: Преимущества
name: features
widget: list
fields:
- { label: Иконка, name: icon, widget: string }
- { label: Заголовок, name: title, widget: string }
- { label: Описание, name: description, widget: text }
Шаблон имени файла
slug определяет имя создаваемого файла. Доступны шаблонные переменные:
# Дата + slug из заголовка
slug: "{{year}}-{{month}}-{{day}}-{{slug}}"
# Результат: 2025-03-15-my-first-post.md
# Только slug
slug: "{{slug}}"
# Кастомное поле
slug: "{{fields.id}}-{{slug}}"
Сортировка и фильтрация в списке
- name: team
label: Команда
folder: content/team
create: true
sortable_fields: ['name', 'position', 'order']
view_filters:
- label: Только активные
field: active
pattern: true
- label: Менеджеры
field: department
pattern: management
view_groups:
- label: По отделу
field: department
Связанные коллекции через relation
- label: Автор
name: author
widget: relation
collection: team
search_fields: ['name', 'position']
value_field: name
display_fields: ['name', 'position']
В Markdown-файле сохранится имя автора как строка. Если нужен ID — меняем value_field: "{{slug}}".
Вложенные записи с иерархией
- name: docs
label: Документация
folder: content/docs
create: true
nested:
depth: 3
summary: "{{title}}"
meta: { path: { label: Путь, widget: parent-path } }
Это включает отображение документации как дерева в боковой панели — полезно для технической документации или каталогов.
Условные поля
fields:
- label: Тип блока
name: type
widget: select
options: [text, video, gallery]
- label: Текст
name: text
widget: markdown
condition:
field: type
value: text
- label: URL видео
name: video_url
widget: string
condition:
field: type
value: video
Поле condition скрывает/показывает поле в зависимости от значения другого поля.
i18n коллекций
i18n:
structure: multiple_files
locales: [ru, en]
default_locale: ru
collections:
- name: services
label: Услуги
folder: content/services
create: true
i18n: true
fields:
- { label: Заголовок, name: title, widget: string, i18n: true }
- { label: Слаг, name: slug, widget: string, i18n: duplicate }
- { label: Контент, name: body, widget: markdown, i18n: true }
i18n: duplicate означает, что поле копируется из основной локали и не переводится. Файлы хранятся как content/services/ru/service-name.md и content/services/en/service-name.md.
Сроки
Конфигурация коллекций для сайта с 5–8 типами контента: 4–8 часов. С i18n, conditional fields, relation-виджетами и проверкой на реальных данных: 1–2 дня.







