Кабинет
Как устроены шаблоны

#Виды в теме

Вид — это вёрстка одного модуля. Тема состоит в основном из них.

{
  "module": "portfolio",
  "code": "moya.portfolio",
  "title": "Моя тема — портфолио",
  "before_content": "<section class=\"works\"><div class=\"wrap\">",
  "html": "<div class=\"grid\">{item}</div>",
  "item_html": "<article><img src=\"{module.portfolio.kartinka}\"><h3>{module.portfolio.zagolovok}</h3></article>",
  "after_content": "</div></section>",
  "css": ".works{padding:80px 0}",
  "js": ""
}
КлючЧто это
moduleимя модуля, чью вёрстку описываем
codeимя вида: по нему его зовут view=moya.portfolio
htmlоболочка списка; {item} — место карточек
item_htmlодна карточка, повторяется по числу записей
before_content / after_contentобёртка вокруг всего
css, jsстили и скрипты вида, уходят отдельными файлами

#Как обращаться к полям записи

{module.имя_модуля.имя_поля} — и никак иначе.

Частая ошибка

Формы {item.поле} в движке нет. Такая метка не подставится, а всё неподставившееся вычищается перед отдачей: карточки выйдут пустыми, и причину будет не видно.

Первая часть — имя модуля, а не справочника. У решений они обычно совпадают (модуль portfolio читает справочник portfolio), но у своего модуля могут различаться — смотрите имя модуля.

Имена полей — настоящие, из справочника. У поставляемого portfolio это zagolovok, tag, cena, cvet, kartinka — не title и не image. Посмотреть: Справочники → нужный → поля.

Некоторые поля получают дополнительные виды:

МеткаЧто даёт
{module.blog.data}дата по-человечески: «12 мая 2026»
{module.blog.data_iso}2026-05-12 — для атрибута datetime
{module.shop.cena}«1 990 ₽»
{module.shop.cena_raw}1990.00 — число для корзины

#Вид страницы — особый случай

У PFM-модуля item_html — это шаблон содержимого записи, а не карточка списка. Если страницы наполняются текстом, в нём обязателен {module.page.content}:

{ "module": "page", "code": "moya.page",
  "html": "<main>{item}</main>",
  "item_html": "{module.page.content}" }
Важно

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

Содержимое записи попадает в документ до раскрытия вызовов блоков, поэтому {module.имя_блока}, написанные владельцем в редакторе страницы, работают. То есть вид страницы — тонкая оболочка, а сама страница собирается из блоков в панели. Разные макеты по типам страниц делаются набором блоков, а не набором видов.

#Какие модули обычно нужны теме

header      шапка
footer      подвал
menu        меню
menuItem    пункт меню
page        страница
block       свободный блок

Плюс те, что приносят решения: portfolio, reviews, faq, form_block, blog. Полный список модулей сайта — раздел Модули в панели.

#Что ещё подставляется в вёрстке

МеткаЧто подставит
{setting.phone}значение из «Настройки сайта»
{module.имя}другой модуль — так шапка попадает на страницу
{PFM.title}поле текущей страницы
{pager}листалка, если у блока включена постраничность

Неподставившееся вычищается: забытая метка не вылезет на сайт — но и не сработает.

#Пример: карточка с картинкой под разные экраны

<article class="work">
  <picture>
    <source srcset="/uploads/m/{module.portfolio.kartinka_name}-m.webp"
            media="(max-width: 640px)">
    <img src="{module.portfolio.kartinka}" alt="{module.portfolio.zagolovok}">
  </picture>
  <h3>{module.portfolio.zagolovok}</h3>
  <p class="work__price">{module.portfolio.cena}</p>
</article>
Примечание

Поля, пришедшие из файлов (…_path, …_name), подставляются уже закодированными: пробел в имени файла иначе ломает srcset целиком. Заголовки и тексты не кодируются — в них может быть нужная разметка.