Модель каталога интернет-магазина
В первой части курса цена детали существовала внутри заказа LAB-041. Теперь добавим «ВелоМастеру» отдельный магазин. Результат урока — небольшая модель каталога, в которой различаются товарная модель, продаваемый вариант, категория и наличие. Она позволит писать страницы без противоречий между услугой и покупкой.
Ассортимент и все числа вымышлены. Учебный снимок датирован 11 октября 2026 года; это не сведения о реальном складе, производителе или спросе. Магазин не принимает оплату, не отправляет заказы и не выгружает предложения платформам. Мы подготовим исходные данные и ожидаемые документы для локального чтения.
Модель товара и продаваемая позиция
Начнём с пяти SKU. SKU — устойчивый внутренний идентификатор продаваемой позиции. Моделей будет четыре: две разные цепи, один шлем с двумя размерами и одно средство для ухода. Категорий три: цепи, шлемы и уход. Если посчитать строки как модели или модели как остатки, каталог сразу начнёт показывать неверные количества.
| SKU | Модель и существенный параметр | Цена | Учебный остаток |
|---|---|---|---|
| VM-C9 | Цепь для 9-скоростной трансмиссии | 1290 ₽ | 12 |
| VM-C10 | Цепь для 10-скоростной трансмиссии | 1590 ₽ | 0 |
| VM-H1-M | Чёрный шлем VM-H1, размер M | 2990 ₽ | 4 |
| VM-H1-L | Чёрный шлем VM-H1, размер L | 2990 ₽ | 2 |
| VM-LW | Средство для ухода за цепью, 100 мл | 490 ₽ | 6 |
Обе цепи в сценарии имеют 116 звеньев и замок в комплекте. Это не делает их взаимозаменяемыми: количество скоростей различается, а реальную совместимость устанавливают по документации оборудования. Размеры шлема заданы учебными диапазонами M — 54–58 см, L — 58–62 см. Они не подтверждают сертификат и не гарантируют подходящую посадку конкретному человеку.
У VM-C10 нулевой остаток. В текущей политике магазин не принимает заказы на отсутствующий товар и не знает дату поставки. Это состояние отличается от предзаказа. Для шлема наличие устанавливается по размеру, а не одним числом для всей модели. Средство VM-LW имеет сезонную редакционную задачу, но никаких температурных испытаний в данных нет.
Адреса и единый источник сведений
Цепи получат /shop/products/vm-c9/ и /shop/products/vm-c10/; средство — /shop/products/vm-lw/. Для шлема оставим одну страницу модели /shop/products/vm-h1/ и выбор размеров, который подробно разберём в шестнадцатом уроке. Категории располагаются по /shop/chains/, /shop/helmets/ и /shop/care/.
Связь товара с услугой не меняет эти адреса. На странице замены цепи можно дать ссылку на подходящий ассортимент, но она не превращается в карточку VM-C9. Покупатель может купить товар без установки, а клиент мастерской может принести собственную деталь. Поэтому стоимость труда 1200 ₽ и цена цепи 1290 ₽ хранятся в разных сущностях.
Учебный фрагмент одной товарной позиции выглядит так:
{
"sku": "VM-C9",
"model_id": "VM-C9",
"category_id": "chains",
"url": "/shop/products/vm-c9/",
"name": "Цепь VM-C9 для 9-скоростной трансмиссии",
"price_rub": 1290,
"stock_units": 12,
"accept_orders": true,
"speeds": 9,
"links": 116,
"included": ["цепь", "замок"],
"fictional": true
}
Поле stock_units сообщает исходное число в снимке. accept_orders описывает правило оформления в нашем сценарии. Они связаны, но не обязаны совпадать в любом магазине: товар могут временно не продавать при наличии остатка. Для этой учебной версии принимаем простой порядок: положительный остаток разрешает покупку, нулевой — нет. Полноценное резервирование и конкурирующие заказы не реализованы.
Наличие и выдача тоже разные условия. Оба филиала выдают товары после подтверждения, но остатки распределены только по учебному складу в целом. Нельзя обещать, что все двенадцать цепей лежат в Речном. Доставка пока не определена. Эти неизвестные сведения следует сохранять как неизвестные, а не заполнять стандартной фразой «доставляем по всей России».
Google рекомендует согласованную структуру адресов и связи между каталогом и карточками, а не обнаружение ассортимента только через внутренний поиск. Наша схема уровней — редакционный выбор для небольшого магазина; документация не требует именно таких имён папок. Адреса интернет-магазина, навигация товарного сайта.
Получить документы из одной записи
Из VM-C9 категория получает название, ссылку, цену и краткое наличие. Карточка — также количество скоростей, комплектацию и ограничения применения. Будущий фид будет использовать тот же SKU и актуальную цену, но потребует дополнительных платформенных полей. Не создавайте три независимых прайса для этих представлений: они быстро разойдутся.
Прочитайте данные VM-C10 с теми же правилами. Цена известна — 1590 ₽, остаток нулевой, заказы не принимаются. Карточка может оставаться полезной для характеристик и обсуждения будущей поставки, но не должна показывать активное обещание немедленной покупки. Наличие цены не доказывает доступность товара.
Изменим условие шлема: посетитель выбирает L. В результатах остаётся модель VM-H1, но продаваемая позиция становится VM-H1-L и количество — два. Цена пока совпадает с M, что не отменяет различия SKU. Если позднее цены разойдутся, структура уже позволит показать значение выбранного варианта без подмены другим размером.
Отсутствующее значение отличается от нулевого остатка
У VM-C10 остаток известен и равен нулю. У распределения товара между филиалами значения нет. Это разные состояния. Первое позволяет сообщить, что заказы сейчас не принимаются; второе не позволяет обещать наличие в определённом месте. Если заменить неизвестность нулём, сайт ошибочно объявит отсутствие в обоих пунктах. Если заменить её общим положительным остатком, пообещает выдачу без подтверждения.
Поэтому в исходных данных сохраняются и числовые поля, и явно неизвестные условия. Доставка, фотографии и GTIN пока не подтверждены. Артикул производителя в учебном мире совпадает с SKU, но такое совпадение не считается универсальным правилом магазинов. В реальном каталоге внутренний идентификатор и артикул изготовителя могут различаться; их связь задают отдельными полями.
Эта модель также объясняет границу расширения страниц. Новый размер уже существующего шлема добавляет вариант, а новая цепь с самостоятельным назначением — модель. Новая категория появляется при отдельной задаче выбора, а не из желания получить ещё один URL. Прежде чем писать дополнительный документ, определите сущность, данные и полезный результат для посетителя. Так ассортимент растёт согласованно, не превращая каждое сочетание параметров в отдельное предложение.
Результат урока — каталог с пятью продаваемыми позициями, четырьмя моделями и тремя категориями. Это согласованная учебная основа, а не работающий склад. В следующем шаге построим полезную страницу категории цепей: она должна показать выбор и ограничения без обещания, что самый дешёвый или доступный вариант подойдёт каждому велосипеду.