Документация

Теги шаблонов: справочник

Деньги, количества, ссылки, переводы, эскизы фотографий, подключение стилей и скриптов — все теги с примерами.

На этой странице

Кроме обычных подстановок, условий и циклов Smarty, теме доступны теги самого магазина. Ниже — все они.

Тег Для чего
{money} сумма с валютой
{qty} дробное количество
{url} адрес раздела витрины
{trans} надпись темы, в том числе со склонением
{thumb} эскиз фотографии нужного размера
{csrf_field} {csrf_token} защита формы
{captcha} проверка «я не робот»
{asset_css} {asset_js} подключить свой стиль или скрипт
{assets_head} {assets_footer} вывести собранный список файлов
{hook} место для дополнений
{dump} {dumpc} посмотреть, что пришло в шаблон

Деньги

{money amount=$product.price currency=$storefront.currency}
{money amount=$order.total currency=$order.currency}
{money amount=$shop->cartTotal() currency=$storefront.currency precision=0}
Параметр По умолчанию Что задаёт
amount 0 сумма
currency USD валюта
locale текущий язык как разделять разряды и дробную часть
precision как в валюте сколько знаков после запятой

⚠️ Валюту передавайте всегда. По умолчанию тег форматирует сумму долларами, и на тестовом магазине с валютой по умолчанию ошибку не видно — а в гривневом магазине цена уедет с долларовым знаком.

precision=0 пригодится там, где копейки ломают вёрстку: сумма корзины в шапке, подпись на карточке.

Тег только форматирует число. Считать в шаблоне не нужно и нельзя — почему, написано на странице Цены, количества и валюта.

Количества

{qty value=$item.qty} {$item.unit}     →  30,8 м²

Товары бывают дробными: метры, килограммы, площадь. Тег выводит число по-местному («30,8», а не «30.8»), отбрасывает хвостовые нули («2», а не «2,000») и не ставит разделитель разрядов — это же число подставляется в поле ввода количества, а «1 200» браузер прочитал бы как «1».

Адреса разделов

<a href="{url path='/search'}">Поиск</a>
<a href="{url path='/'}">На главную</a>
<a href="{url path='/cart' locale='uk'}">Кошик</a>
Параметр По умолчанию Что задаёт
path / путь раздела
locale текущий язык язык, на котором открыть раздел
absolute нет полный адрес с доменом вместо пути

Тег сам добавляет языковой префикс и приводит адрес к виду, принятому в магазине. Полный адрес нужен только поисковику — для ссылок внутри сайта берите обычный.

Адреса товаров, категорий, брендов, меток и страниц уже приходят готовыми в данных ($product.url, $cat.url). Склеивать их руками нельзя: схему адресов выбирает владелец магазина. Подробности — на странице Адреса разделов и языки.

Надписи темы

{trans key="shop.cart"}
{trans key="shop.products_count" count=$total}
{trans key="shop.hello" name=$customer.first_name}

Строка берётся из файла темы locale/<язык>.json, а если ключа там нет — из надписей самого магазина. Не нашлось нигде — выведется сам ключ: страница не падает, но в вёрстке будет висеть shop.cart.

Всё, кроме key, считается подстановкой: {trans key="shop.hello" name="Иван"} подставит имя вместо :name в строке.

Параметр count включает выбор формы по числу — «1 товар», «2 товара», «5 товаров». Как записать такую строку, написано на странице Тексты темы и языки.

Эскизы фотографий

<img src="{thumb src=$product.image size=320}" alt="{$product.name}">
<img src="{thumb src=$product.image size=120 type='crop'}" alt="">
type Что делает
max (по умолчанию) вписывает картинку целиком в квадрат со стороной size
crop обрезает до квадрата size × size
width задаёт ширину, высота считается сама
height задаёт высоту, ширина считается сама

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

Формы

<form method="post" action="/reviews/submit">
    {csrf_field}
    …
    {captcha form="reviews"}
    <button type="submit">Отправить</button>
</form>

{csrf_field} ставит скрытое поле — без него форма не пройдёт. {csrf_token} отдаёт тот же ключ строкой; в каркас его вставлять не надо — мета-тег csrf-token печатает магазин, а скриптам ключ приходит в CartiX.csrf.

{captcha form="…"} сам спрашивает, включена ли проверка «я не робот» для этой формы, и рисует нужный виджет. Проверка выключена — тег не выводит ничего, и ветку {if} вокруг него писать не надо.

Подробнее — на странице Формы витрины.

Стили и скрипты

{block name="page_assets"}
    {asset_css file="css/product.css"}
    {asset_js file="js/product.js" defer=true}
{/block}
Параметр Что делает
file путь внутри assets/ вашей темы
inline вставить содержимое прямо в страницу, а не ссылкой
key имя, по которому файл не подключится дважды
head / footer куда выводить
остальные уезжают атрибутами в <link> или <script>

{assets_head} и {assets_footer} выводят собранный список. Подробности и подвохи — на странице Стили, скрипты и картинки темы.

Место для дополнений

{hook name="product.buybox.end" product=$product}

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

Всё, что передано параметрами, уезжает дополнению — поэтому полезно передавать контекст: товар, позицию корзины. Полный список мест — на странице Точки для дополнений.

Посмотреть, что пришло в шаблон

{dump}                    всё, что доступно этому шаблону
{dump var=$product}       одно значение
{dumpc var=$product}      то же самое в консоль браузера
{$product|dump nofilter}  привычной записью

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

Теги дополнений

Дополнение может завести собственный тег — он появится во всех темах сразу. Установленные сейчас:

Тег Дополнение
{slider id="home-hero"} Слайдеры и баннеры
{slider_data id="home-hero" assign=hero} то же, отдаёт данные в переменную
{oneclick_button product=$product} Купить в один клик
{back_in_stock product=$product} Сообщить о поступлении
{callback_button} Обратный звонок
{shorturl url=$product.url} Короткие ссылки

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

Что приносит установленное дополнение, видно двумя способами: в его описании в разделе «Дополнения» и по папке templates/plugins/<дополнение>/ в вашей теме — дополнение с собственной разметкой кладёт шаблоны прямо туда.

Обработчики значений

В Smarty 5 в шаблон нельзя писать любую функцию языка. Магазин возвращает безопасный набор:

Текст. ucfirst, lcfirst, ucwords, trim, ltrim, rtrim, str_pad, str_replace, str_contains, str_starts_with, str_ends_with, sprintf, strrev, mb_strlen, mb_substr, mb_strtolower, mb_strtoupper, urlencode, rawurlencode, htmlspecialchars_decode.

Числа. abs, ceil, floor, intval, floatval, max, min, intdiv.

Списки. array_keys, array_values, array_slice, array_reverse, array_sum, array_unique, array_flip.

Отладка. dump, dumpc.

Сверх этого работает всё, что Smarty умеет сам: count, round, implode, substr, json_encode, date_format, escape, default, upper, nl2br, truncate, strip_tags.

{$product.name|mb_strtoupper}
{$product.summary|truncate:120:'…'}
{$product.price|default:0}
{$order.created_at|date_format:'%d.%m.%Y'}

Незнакомый обработчик страницу не ломает: значение проходит насквозь, а имя уходит в журнал. Так опечатка не превращается в белый экран у покупателя — но и не даёт о себе знать, поэтому перед выкладкой в журнал стоит заглянуть.

Экранирование

Всё, что выводится, экранируется само. {$product.name} безопасен всегда, даже если в названии товара есть < или кавычки.

Там, где данные содержат готовую разметку, нужен nofilter:

{$page.content nofilter}       содержимое информационной страницы
{$product.description nofilter} описание товара
{$product.json nofilter}       карта вариантов покупки для браузера

Забыли nofilter — покупатель увидит текст с &lt;p&gt; вместо абзацев.

Чего в теме нет

Теги {sum}, {in_words}, {number} и {profile} относятся к печатным бланкам — счетам, накладным, чекам, — а не к витрине. В шаблоне темы их нет. Про них написано в разделе Печатные бланки.

Обновлено 25 августа 2026