Перейти к содержимому

Что такое макет

Блоки описывают содержимое страницы, макет — документ вокруг него: <!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 — обёртку вокруг неё строит витрина.

Всё это — механика блоков, отдельной у макета нет:

Документ-макет уезжает в 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 — те же теги на клиенте