Настройка Entry Types и Sections Craft CMS
Sections и Entry Types — фундамент структуры контента в Craft CMS. Неправильная архитектура на этом уровне приводит к переработке через месяц. Понимание разницы между типами Sections сокращает время проектирования.
Типы Sections
Channel — коллекция записей без иерархии. Блог, новости, товары, вакансии. URL строится как /blog/{slug}.
Structure — иерархические страницы с возможностью вложенности и ручной сортировки. Документация, каталог с подкатегориями. URL: /services/web-development/landing-pages.
Single — одна уникальная запись. Homepage, About, Contact. Нет slug, нет архива.
Entry Types
Каждый Section может иметь несколько Entry Types с разными наборами полей. Пример для Section Blog:
Section: blog (Channel)
├── Entry Type: article
│ └── Fields: body (Matrix), readingTime (calculated), podcast (false)
├── Entry Type: podcast
│ └── Fields: audioFile (Asset), transcript (Redactor), duration (Number)
└── Entry Type: video
└── Fields: videoUrl (URL), thumbnail (Asset), youtubeId (computed)
В Twig разделяем отображение по типу:
{% switch entry.type.handle %}
{% case 'article' %}
{% include '_blog/_article' %}
{% case 'podcast' %}
{% include '_blog/_podcast' %}
{% case 'video' %}
{% include '_blog/_video' %}
{% endswitch %}
Настройка через Project Config (YAML)
# config/project/sections/blog.yaml
name: Blog
handle: blog
type: channel
enableVersioning: true
defaultPlacement: end
propagationMethod: all
siteSettings:
default:
hasUrls: true
uriFormat: 'blog/{slug}'
template: blog/_entry
enabledByDefault: true
entryTypes:
article:
name: Article
handle: article
hasTitleField: true
titleTranslationMethod: site
fieldLayout:
- type: craft\fieldlayoutelements\TitleField
- type: craft\fieldlayoutelements\CustomField
fieldUid: [uid-of-body-field]
- type: craft\fieldlayoutelements\CustomField
fieldUid: [uid-of-categories-field]
Настройка Structure с вложенностью
Section: services (Structure)
├── maxLevels: 3
├── enableVersioning: true
└── defaultSort: structure (ручная сортировка в дереве)
Запрос дочерних элементов:
{# Получить всех потомков текущей страницы #}
{% set children = craft.entries()
.section('services')
.descendantOf(entry)
.level(entry.level + 1)
.orderBy('lft asc')
.all() %}
Поля с опцией translationMethod
При мультисайтовости важно правильно настроить трансляцию:
-
none— одно значение для всех сайтов -
site— своё значение для каждого сайта -
language— своё значение для каждого языка -
siteGroup— своё значение для группы сайтов
Настройка 5–8 секций с Entry Types — 1–2 дня.







