Skip to content
MiniShop3
MiniShop3
Современный компонент интернет-магазина для MODX 3
  1. Компоненты
  2. MiniShop3
  3. Интерфейс фронтенда
  4. Страница товара

Страница товара

Страница товара — детальное представление одного продукта с галереей, ценой, опциями и формой добавления в корзину.

Структура страницы

КомпонентФайлНазначение
Шаблон страницыelements/templates/product.tplРазметка страницы товара
Галереяtpl.msGalleryСлайдер изображений с лайтбоксом
Опции товараtpl.msProductOptionsВывод характеристик товара

Шаблон страницы

Путь: core/components/minishop3/elements/templates/product.tpl

Шаблон наследуется от базового (base.tpl) и содержит следующие разделы:

fenom
{extends 'file:templates/base.tpl'}
{block 'pagecontent'}
    <div class="container py-4">
        {* Хлебные крошки *}
        {* Основная информация (галерея + карточка) *}
        {* Табы (описание, характеристики, доставка) *}
        {* Похожие товары *}
    </div>
{/block}

Разделы страницы

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

Навигационная цепочка от главной до текущего товара:

fenom
<nav aria-label="breadcrumb" class="mb-4">
    <ol class="breadcrumb">
        <li class="breadcrumb-item"><a href="/">Главная</a></li>
        {if $_modx->resource.parent > 0}
            <li class="breadcrumb-item">
                <a href="/{$_modx->resource.parent | resource : 'uri'}">
                    {$_modx->resource.parent | resource : 'pagetitle'}
                </a>
            </li>
        {/if}
        <li class="breadcrumb-item active">{$_modx->resource.pagetitle}</li>
    </ol>
</nav>

Галерея товара

Галерея использует библиотеки Splide для слайдера и GLightbox для просмотра в полном размере.

fenom
{'!msGallery'|snippet: [
    'tpl' => 'tpl.msGallery'
]}

Возможности галереи

  • Основной слайдер — крупные изображения с fade-эффектом
  • Миниатюры — навигация по изображениям (скрываются при одном фото)
  • Лайтбокс — просмотр в полном размере по клику
  • Lazy loading — отложенная загрузка изображений
  • Заглушка — показывается при отсутствии изображений

Плейсхолдеры в tpl.msGallery

ПлейсхолдерТипОписание
{$files}arrayМассив изображений товара
{$file['url']}stringПолный URL изображения
{$file['small']}stringURL миниатюры (small)
{$file['medium']}stringURL среднего размера (medium)
{$file['name']}stringНазвание файла
{$file['description']}stringОписание изображения

Подробнее о сниппете: msGallery


Информация о товаре

Правая колонка с данными товара включает:

Производитель и название

fenom
{if $vendor_name?}
    <div class="text-muted text-uppercase mb-2">
        {$vendor_name}
    </div>
{/if}

<h1 class="mb-3">{$_modx->resource.pagetitle}</h1>

Артикул и статус наличия

fenom
<div class="d-flex align-items-center gap-3 mb-3">
    {if $article?}
        <span class="text-muted">Артикул: <strong>{$article}</strong></span>
    {/if}

    {if $stock? && $stock > 0}
        <span class="badge bg-success">В наличии</span>
    {else}
        <span class="badge bg-secondary">Под заказ</span>
    {/if}
</div>

Бейджи товара

БейджУсловиеСтиль
NEW{$new?}badge bg-primary
ХИТ ПРОДАЖ{$popular?}badge bg-warning text-dark
РЕКОМЕНДУЕМ{$favorite?}badge bg-danger

Блок цены

Цена выделена в отдельный блок с фоном:

fenom
<div class="product-price mb-4 p-4 bg-light rounded">
    {if $old_price? && $old_price > 0}
        <div class="old-price text-muted text-decoration-line-through mb-2">
            {$old_price}
        </div>

        {if $discount?}
            <div class="badge bg-danger mb-2">
                Скидка {$discount}%
            </div>
        {/if}
    {/if}

    <div class="current-price display-4 fw-bold text-primary">
        {$price ?: 0}
    </div>
</div>

Расчёт скидки

Процент скидки рассчитывается автоматически сниппетом msProducts при наличии old_price. Формула: (old_price - price) / old_price * 100


Опции товара

Если у товара есть опции color или size, они выводятся в виде кнопок:

fenom
{if $color?}
    <div class="option-group mb-3">
        <label class="form-label fw-semibold">Цвет:</label>
        <div class="d-flex flex-wrap gap-2">
            {foreach $color as $colorOption}
                <button type="button" class="btn btn-outline-secondary btn-sm option-btn">
                    {$colorOption}
                </button>
            {/foreach}
        </div>
    </div>
{/if}

JavaScript активирует первую опцию по умолчанию и обрабатывает клики для переключения.


Форма добавления в корзину

Страница содержит две формы с переключением состояния:

Состояние "Добавить"

Показывается когда товара нет в корзине:

fenom
<form method="post" class="ms3_form" data-cart-state="add">
    <input type="hidden" name="id" value="{$_modx->resource.id}">
    <input type="hidden" name="options" value="[]">
    <input type="hidden" name="ms3_action" value="cart/add">

    <div class="row g-3 align-items-end">
        <div class="col-auto">
            <label class="form-label">{'ms3_cart_count' | lexicon}:</label>
            <input type="number" name="count" value="1" min="1" class="form-control">
        </div>
        <div class="col">
            <button type="submit" class="btn btn-primary btn-lg w-100">
                {'ms3_cart_add' | lexicon}
            </button>
        </div>
    </div>
</form>

Состояние "В корзине"

Показывается когда товар уже добавлен:

fenom
<form method="post" class="ms3_form product-cart-controls-hidden" data-cart-state="change">
    <input type="hidden" name="product_key" value="">
    <input type="hidden" name="ms3_action" value="cart/change">

    <div class="row g-3 align-items-end">
        <div class="col-auto">
            <div class="input-group">
                <button class="btn btn-outline-primary dec-qty" type="button">−</button>
                <input type="number" name="count" value="1" min="0" class="form-control text-center">
                <button class="btn btn-outline-primary inc-qty" type="button">+</button>
            </div>
        </div>
        <div class="col">
            <button type="button" class="btn btn-success btn-lg w-100" disabled>
{'ms3_cart_in_cart' | lexicon}
            </button>
        </div>
    </div>
</form>

Переключение происходит автоматически через JavaScript модуль ProductCardUI при событии ms3:cart:updated.


Дополнительная информация

Блок с иконками для веса, страны производства и доставки:

fenom
<ul class="list-unstyled mb-0">
    {if $weight? && $weight > 0}
        <li class="mb-2">
            <svg width="16" height="16"><use href="#icon-box"/></svg>
            <span class="text-muted">Вес:</span> <strong>{$weight} кг</strong>
        </li>
    {/if}
    {if $made_in?}
        <li class="mb-2">
            <svg width="16" height="16"><use href="#icon-globe"/></svg>
            <span class="text-muted">Страна производства:</span> <strong>{$made_in}</strong>
        </li>
    {/if}
</ul>

Табы с информацией

Bootstrap-табы для организации контента:

ТабСодержимое
ОписаниеПолное описание из {$_modx->resource.description}
ХарактеристикиТаблица свойств товара
ДоставкаИнформация о способах доставки
fenom
<ul class="nav nav-tabs mb-4" role="tablist">
    <li class="nav-item">
        <button class="nav-link active" data-bs-toggle="tab" data-bs-target="#description">
            Описание
        </button>
    </li>
    <li class="nav-item">
        <button class="nav-link" data-bs-toggle="tab" data-bs-target="#specs">
            Характеристики
        </button>
    </li>
    <li class="nav-item">
        <button class="nav-link" data-bs-toggle="tab" data-bs-target="#delivery">
            Доставка
        </button>
    </li>
</ul>

<div class="tab-content">
    <div class="tab-pane fade show active" id="description">
        {$_modx->resource.description}
    </div>
    <!-- ... остальные табы ... -->
</div>

Таблица характеристик

Автоматически заполняется из полей товара:

ПолеПлейсхолдер
Артикул{$article}
Производитель{$vendor_name}
Страна производства{$made_in}
Вес{$weight}
Доступные цвета{$color} (массив)
Доступные размеры{$size} (массив)

Похожие товары

Блок с товарами из той же категории:

fenom
<div class="related-products mt-5">
    <h3 class="mb-4">Похожие товары</h3>
    <div class="row">
        {'!msProducts' | snippet : [
            'tpl' => 'tpl.msProducts.row',
            'parents' => $_modx->resource.parent,
            'resources' => '-' ~ $_modx->resource.id,
            'limit' => 4,
            'formatPrices' => 1,
            'withCurrency' => 0
        ]}
    </div>
</div>
ПараметрЗначениеНазначение
parentsID родительской категорииТовары из той же категории
resources-ID текущего товараИсключить текущий товар
limit4Показать 4 товара

Плейсхолдеры товара

На странице товара доступны все поля из таблиц msProduct и msProductData:

Основные поля

ПлейсхолдерТипОписание
{$_modx->resource.id}intID ресурса товара
{$_modx->resource.pagetitle}stringНазвание товара
{$_modx->resource.introtext}stringКраткое описание
{$_modx->resource.description}stringПолное описание
{$_modx->resource.parent}intID родительской категории
{$_modx->resource.uri}stringURL товара

Поля msProductData

ПлейсхолдерТипОписание
{$article}stringАртикул
{$price}floatЦена
{$old_price}floatСтарая цена
{$weight}floatВес
{$stock}intОстаток на складе
{$vendor_id}intID производителя
{$vendor_name}stringНазвание производителя
{$made_in}stringСтрана производства
{$new}boolФлаг "Новинка"
{$popular}boolФлаг "Популярный"
{$favorite}boolФлаг "Рекомендуемый"

Опции товара

ПлейсхолдерТипОписание
{$color}arrayМассив доступных цветов
{$size}arrayМассив доступных размеров
{$discount}intПроцент скидки (рассчитывается)

Кастомизация

Создание своего шаблона

  1. Скопируйте product.tpl в папку вашей темы
  2. Внесите необходимые изменения
  3. Назначьте шаблон товарам в админке

Изменение галереи

Создайте свой чанк и укажите его в вызове:

fenom
{'!msGallery'|snippet: [
    'tpl' => 'myCustomGallery'
]}

Добавление своих табов

Расширьте блок табов в шаблоне:

fenom
<li class="nav-item">
    <button class="nav-link" data-bs-toggle="tab" data-bs-target="#reviews">
        Отзывы
    </button>
</li>

<div class="tab-pane fade" id="reviews">
    {'!msProductReviews' | snippet : ['product' => $_modx->resource.id]}
</div>

CSS-классы

КлассЭлемент
.product-infoКонтейнер информации о товаре
.product-priceБлок цены
.product-optionsКонтейнер опций
.option-groupГруппа опций (цвет, размер)
.option-btnКнопка выбора опции
.product-metaДополнительная информация
.product-tabsКонтейнер табов
.related-productsБлок похожих товаров
.ms3-galleryКонтейнер галереи
.ms3-gallery-mainОсновной слайдер
.ms3-gallery-thumbsСлайдер миниатюр

Зависимости

Шаблон использует следующие библиотеки:

БиблиотекаВерсияНазначение
Bootstrap 55.3.3CSS-фреймворк
Splide4.1.4Слайдер галереи
GLightbox3.3.0Лайтбокс для изображений

Библиотеки подключаются через CDN. Для production рекомендуется использовать локальные копии.