На прошлой странице мы выяснили: CMS хранит текст отдельно от вёрстки. Шаблон — это и есть та самая вёрстка, которая лежит отдельно. Ровно тот HTML, который вы написали, плюс несколько меток в квадратных скобках.

Откуда берётся шаблон

Возьмите две готовые страницы своего сайта и положите рядом. Скорее всего, совпадёт почти всё: шапка, меню, боковая колонка, подвал, подключение стилей. Отличаться будут заголовок и текст посередине.

Вот это «почти всё» и есть шаблон. Различия вынимаются и заменяются метками. Метку в Evolution называют плейсхолдером — от английского placeholder, «держатель места»: она занимает место, пока туда не подставили настоящее значение.

Простейший шаблон целиком
<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="UTF-8">
  <title>[*pagetitle*]</title>
  <meta name="description" content="[*description*]">
  <link rel="stylesheet" href="assets/css/base.css">
</head>
<body>

  <h1>[*pagetitle*]</h1>
  [*content*]

</body>
</html>

Этот шаблон обслуживает любое количество страниц. Откроют «Контакты» — на месте [*pagetitle*] окажется слово «Контакты», на месте [*content*] — текст контактов. Откроют «Об авторе» — те же места займёт другое. Сам шаблон при этом не меняется никогда.

Что можно вызвать в шаблоне

У каждой страницы в Evolution есть набор полей — они заполняются в админке, когда страницу создают. Любое из них вызывается в шаблоне одинаково: имя поля в квадратных скобках со звёздочками.

Поля, которые нужны почти всегда
Плейсхолдер Что подставит Куда обычно ставят
[*pagetitle*] Заголовок страницы — то, что видно в дереве админки <title> и <h1>
[*longtitle*] Расширенный заголовок, если короткого мало <title>, Open Graph
[*description*] Описание страницы для поисковика <meta name="description">
[*content*] Основной текст, набранный в редакторе тело статьи
[*introtext*] Короткий анонс — первый абзац для списков карточки, лента материалов
[*id*] Номер страницы в базе данных ссылки, классы для стилей
[(site_url)] Адрес сайта целиком пути к файлам, canonical

Последняя строка отличается от остальных: круглые скобки вместо звёздочек означают не поле страницы, а настройку всего сайта. Разница пригодится дальше — например, чтобы пути к стилям стали абсолютными и работали на любой странице, как бы глубоко она ни лежала.

Скобки различаются по смыслу

[*поле*] — данные текущей страницы, [(настройка)] — настройка сайта, {{чанк}} — кусок разметки, [[сниппет]] — кусок программы. Про два последних — на следующих страницах; сейчас достаточно знать, что скобки не одинаковые и подставляют разное.

Сколько шаблонов нужно сайту

Первая мысль новичка — по шаблону на страницу. Это ровно то, от чего мы уходили: полсотни шаблонов ничем не лучше полусотни HTML-файлов.

Правило простое: новый шаблон заводится тогда, когда меняется расположение блоков, а не когда меняется текст. У этого сайта больше полусотни страниц и всего три шаблона.

На этом я потерял вечер

Завёл отдельный шаблон для страницы «Что такое CMS», потому что «у неё же таблица». Потом понадобилось поправить боковое меню — и правок оказалось две вместо одной. Таблица, картинка, блок кода — это содержимое, а не устройство страницы. Они приходят из [*content*] и на шаблон не влияют.

Настоящий шаблон этого сайта

Вот сокращённый шаблон внутренней страницы — той самой, которую вы сейчас читаете. Куски в фигурных скобках — это чанки, разговор о них на следующей странице.

Шаблон «Внутренняя страница»
<!DOCTYPE html>
<html lang="ru">
<head>
  {{chunk-head}}
</head>
<body class="page">

  <a class="skip-link" href="#main">Перейти к содержанию</a>
  {{chunk-sprite}}
  {{chunk-header}}

  <main class="page__main" id="main" tabindex="-1">
    <section class="page-header">
      <div class="container">
        [[DLCrumbs]]
        <h1 class="page-header__title">[*pagetitle*]</h1>
        <p class="page-header__lead">[*introtext*]</p>
      </div>
    </section>

    <section class="section">
      <div class="container">
        <div class="page-layout">
          [[DocLister]]
          <article class="article">
            [*content*]
          </article>
        </div>
      </div>
    </section>
  </main>

  {{chunk-footer}}
</body>
</html>

Обратите внимание: разметка осталась моей. Те же классы, те же теги, тот же порядок блоков, что в статическом файле. Изменились три вещи — повторяющиеся куски уехали в чанки, текст заменился плейсхолдерами, а списки (крошки, боковое меню) стали вызовами сниппетов, потому что их нужно не подставить, а собрать.

Где шаблоны лежат в админке

Почему статика верстается под будущий шаблон

Весь сайт сначала свёрстан обычными файлами и только потом переедет в CMS — это пятый этап. Чтобы переезд не превратился в переделку, повторяющиеся куски помечены в разметке комментариями уже сейчас:

Метка в статической вёрстке
<!-- CHUNK: header -->
<header class="site-header">
  ...
</header>
<!-- /CHUNK: header -->

На пятом этапе всё, что лежит между такими комментариями, переносится в CMS один в один, а на его месте в шаблоне остаётся {{chunk-header}}. Вырезал, вставил, заменил строкой. Откройте исходный код этой страницы в браузере — метки видны, они настоящие.

Что спросить у нейросети

Разбить свою вёрстку на шаблоны проще, когда есть с кем посоветоваться. Запрос можно скопировать и подставить свои страницы.

Мой запрос

У меня свёрстан сайт на Evolution CMS. Страницы такие: главная, хаб раздела со списком карточек, внутренняя статья с боковым меню, страница контактов с формой, страница 404.

Скажи, сколько шаблонов тут действительно нужно и какие страницы можно объединить в один. Для каждого шаблона перечисли, что в нём остаётся жёстко, а что должно стать плейсхолдером или чанком.

Объясни решение: почему именно так, а не по шаблону на страницу. Если два шаблона отличаются одним блоком — предложи, как обойтись одним.

Ответ проверяйте на своей вёрстке

Нейросеть не видела ваших страниц и рассуждает по описанию. Мне предложили объединить контакты с внутренней страницей — и это оказалось верно, хотя сначала я был уверен, что форме нужен свой шаблон. А вот совет вынести подвал в плейсхолдер был ошибкой: подвал — это чанк.

Что теперь понятно

  • Шаблон — это ваша вёрстка, из которой вынули текст и оставили метки
  • [*pagetitle*] — поле страницы, [(site_url)] — настройка сайта
  • Новый шаблон заводится при смене расположения блоков, а не при смене текста
  • Сорока страницам этого сайта хватает трёх шаблонов