Что такое макет
Блоки описывают содержимое страницы, макет — документ вокруг него: <!DOCTYPE html>,
<head> с мета-тегами, шапка, навигация, подвал и место, куда попадёт содержимое.
Макет — это документ вида «Макет» (kind: layout), устроенный как обычная страница
из блоков. Отличие одно: на верхнем уровне у него стоит ровно один блок особой роли —
лэйаут, а шапка, сайдбар и подвал лежат в его слотах обычными блоками и
переиспользуются между макетами.
Отдельной сущности «макет» со своим шаблоном в PageCraft нет: всё, что вы знаете про блоки — схема полей, ревизии, версии, библиотека, форк, пометка «устарело», поиск — работает и здесь, потому что макет и есть блоки.
Из чего состоит
Заголовок раздела «Из чего состоит»| Часть | Что это |
|---|---|
Документ kind: layout |
контейнер: имя, сайт, папка. Своего адреса и SEO-полей у него нет |
| Лэйаут | блок с role: layout — обёртка документа, единственный на верхнем уровне |
| Блоки в слотах лэйаута | шапка, меню, подвал — обычные блоки библиотеки |
Как устроен сам лэйаут, какие теги обязательны в его шаблоне и почему он бывает только
типа schema — Анатомия блока → роль блока.
Обязательные точки вставки
Заголовок раздела «Обязательные точки вставки»В шаблоне лэйаута обязательны два тега; без любого из них блок не сохранится (422):
| Тег | Куда ставится | Обязателен | Что подставит витрина |
|---|---|---|---|
{{ content }} |
тело документа | да | страницу |
{{ cms_assets_head }} |
внутрь <head> |
да | CSS сайта, цветовые схемы, счётчики |
{{ cms_assets_body_start }} |
сразу после <body> |
нет | то, что обязано идти первым в теле |
{{ cms_assets_body_end }} |
перед </body> |
нет | скрипты конца документа |
Все четыре уезжают в опубликованный шаблон маркерами, а не пустыми строками:
заполняет их 4CMS в момент показа страницы. В предпросмотре редактора на месте
{{ content }} — плашка «здесь будет страница», ассеты гасятся пустыми строками.
Минимальный шаблон лэйаута
Заголовок раздела «Минимальный шаблон лэйаута»<!DOCTYPE html><html lang="ru"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> {{ cms_assets_head }} <style>{{ props.custom_css }}</style></head><body> {{ slots.header }}
<main> {{ content }} </main>
{{ slots.footer }}</body></html>{{ slots.header }} и {{ slots.footer }} — слоты композиции: объявите их в схеме
лэйаута, и в редакторе документа появятся зоны, куда кладутся блоки шапки и подвала.
Формат — Композиция страницы.
Кто применяет макет к странице
Заголовок раздела «Кто применяет макет к странице»Витрина, а не PageCraft. Опубликованный макет — это шаблон 4CMS, и какую страницу
положить внутрь него, решает 4CMS. PageCraft отдаёт тело шаблона с маркером
{{ content }} и не хранит связи «страница → макет»: у страницы нет поля «оформление».
Отсюда следствие: страница публикуется разделёнными html, styles и scripts —
обёртку вокруг неё строит витрина.
Ревизии, библиотека, версии
Заголовок раздела «Ревизии, библиотека, версии»Всё это — механика блоков, отдельной у макета нет:
- Ревизии блока — как считаются мажорные и минорные версии;
- Схема полей — формат
schema_content, включая слоты; - Пометка «устарело» — вывод лэйаута из обращения.
Как публикуется
Заголовок раздела «Как публикуется»Документ-макет уезжает в 4CMS тем же вызовом, что шаблон рубрики. Перед отправкой
PageCraft проверяет, что лэйаут в документе есть и что в его шаблоне стоит
{{ cms_assets_head }}; иначе — 422, и в 4CMS не уходит ничего. Сам документ при этом
остаётся сохранённым: собирать макет по частям — нормально, публиковать пустую
обёртку — нет.
Подробности — Публикация.
Источники
Заголовок раздела «Источники»Страница написана против кода:
backend/src/Service/Block/LayoutTemplateValidator.php— обязательные точки вставкиbackend/src/Service/Page/LayoutDocumentValidator.php— проверка перед публикациейbackend/src/Service/Page/BlockPlacementValidator.php— где лэйаут можно разместитьbackend/src/Publishing/BlockRenderer.php— маркерыcontentиcms_assets_*front/src/lib/layoutContent.ts— те же теги на клиенте