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

Адреса разделов и языки

Три схемы адресов, языковые префиксы и правило: ссылки берут готовыми, а не склеивают руками.

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

Адреса разделов витрины строит сам магазин. Тема их берёт готовыми, а не склеивает руками — потому что вид адреса выбирает владелец магазина, и тема, собравшая ссылку сама, сломается у половины магазинов.

Готовые адреса приходят в данных

{$product.url}      {$cat.url}      {$page.url}
{$brand.url}        {$tag.url}
{$crumb.url}        {$chip.url}     {$pagination.next_url}

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

Тег {url} — для разделов без своего адреса

<a href="{url path='/search'}">Поиск</a>
<a href="{url path='/'}">На главную</a>
<a href="{url path=$shop->cartPath()}">Корзина</a>
<a href="{url path='/cart' locale='uk'}">Кошик</a>
<link rel="canonical" href="{url path='/' absolute=true}">

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

Три схемы адресов

Схему выбирает владелец в настройках. Одна и та же тема должна работать при любой из них — ещё одна причина не склеивать адреса руками.

Схема Категория Товар
natural (по умолчанию) /телефоны/apple/ /телефоны/apple/iphone-15/
mixed /category/телефоны/apple/ /iphone-15/
flat /category/apple/ /product/iphone-15/

Канон витрины — завершающий слеш: /cart/, /телефоны/apple/. Корень — просто /.

Языки

Витрина может работать на нескольких языках. Основной идёт без префикса, остальные — с префиксом:

/                русский  (основной язык витрины)
/uk/             украинский
/en/             английский

Префикс задаётся в справочнике языков и может отличаться от кода языка: язык uk часто получает префикс ua. Поэтому в переключателе выводят prefix или short, а не code.

Адрес един для всех языков

Адрес (slug) товара и категории один на все языки — он лежит у самой сущности, а не в переводах. Переводится содержимое: название, описание, SEO-поля. Меняется только языковой префикс.

/telefony/iphone-15/        русская версия
/uk/telefony/iphone-15/     украинская версия — тот же адрес

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

Переключатель языка

{foreach $shop->locales() as $l}
    <a href="{$l.url}"{if $l.active} class="is-active"{/if}
       lang="{$l.code}">{$l.short}</a>
{/foreach}

Поля: code (ru), prefix (uk или ua), name (название на родном языке: Русский, Українська, English), short (префикс заглавными), active, url.

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

Ссылки для поисковика

canonical и hreflang магазин считает сам и кладёт в $seo — тема их только выводит:

{if $seo.canonical}<link rel="canonical" href="{$seo.canonical}">{/if}
{foreach $seo.hreflang as $code => $href}
    <link rel="alternate" hreflang="{$code}" href="{$href}">
{/foreach}

Собирать их самостоятельно не нужно и не стоит: там учитываются и схема адресов, и домены витрин, и то, какие страницы вообще разрешено индексировать.

Адреса действий

Адреса, по которым браузер обращается к магазину — добавить в корзину, пересчитать оформление, отправить отзыв, — тема не пишет в скриптах, а объявляет атрибутами на <body>:

<body data-cart-add="/cart/add" data-cart-update="/cart/update" …>

Полный список — на странице Атрибуты data-*.

Хлебные крошки

{if $breadcrumbs}
    <nav class="breadcrumbs">
        {foreach $breadcrumbs as $crumb}
            {if $crumb@last}
                <span>{$crumb.name}</span>
            {else}
                <a href="{$crumb.url}">{$crumb.name}</a>
            {/if}
        {/foreach}
    </nav>
{/if}

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

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