Перейти к содержанию

Модель каталога интернет-магазина

В первой части курса цена детали существовала внутри заказа 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. Прежде чем писать дополнительный документ, определите сущность, данные и полезный результат для посетителя. Так ассортимент растёт согласованно, не превращая каждое сочетание параметров в отдельное предложение.

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