Что такое pbShop
pbShop — магазин для сайтов на PageBlocks 3.x: товары (они же тарифы и услуги) с опциями и вариантами, категории, остатки, корзина, доставка, заказы, цены в нескольких валютах, платежи, подписки и события, на которые сайт вешает свою логику.
Это не самостоятельное приложение. Без установленного PageBlocks компонент пишет ошибку в лог и выключается: оттуда приходят таблицы и конструктор полей, роутинг, контроллеры, файловые шаблоны, миграции и шаблонизатор. pbShop не изобретает ничего из этого — он приносит доменную логику магазина и два способа её вызвать.
Один результат — три пути
Это главная мысль, и с неё стоит начать, потому что дальше вся документация поделена именно так.
// Вёрстка — шаблон MODX
[[!pbProducts? &parent=`mugs` &tpl=`card` &limit=`12`]]
// Вёрстка — Fenom в файловом шаблоне
{'!pbProducts' | snippet: ['parent' => 'mugs', 'tpl' => 'card', 'limit' => 12]}
// Разработчик — контроллер, сниппет не нужен вообще
$products = $shop->products()->inCategory('mugs')->limit(12)->get();
return $this->render('catalog.tpl', ['products' => $products]);Три пути — один сервис. Ни один из них не «правильнее» остальных, и ни один не проходит через другой: верстальщик никогда не обязан открывать IDE, разработчик никогда не обязан пользоваться сниппетами. Проект может быть собран целиком первым способом, целиком вторым или вперемешку — для агентства это основной сценарий, а не экзотика.
Логика живёт в сервисе
Сниппет — адаптер на десяток строк. Всё, что он умеет, доступно прямым вызовом, и наоборот: возможность, нужная в типовом сценарии, обязана иметь вызов одной строкой. Если что-то есть только в сниппете — это дефект, а не удобство.
Куда идти дальше
| Вы | Начните с |
|---|---|
| Знаете HTML и CSS, работаете в шаблонах MODX | Быстрый старт |
| Пишете роуты и контроллеры, работаете в IDE | Разработчику |
Что внутри
Каталог. Категории с вложенностью, товар в нескольких категориях, ЧПУ с каноническим адресом, опции и характеристики, варианты со своей ценой, весом, остатком и артикулом, генератор вариантов, подбор по опциям, цена «от» у составного товара.
Корзина и оформление. Гостевая корзина по cookie, слияние с пользовательской при входе, промокоды, расчёт доставки под состав, покупка в один клик, согласие на обработку данных, регистрация на оформлении через pbAuth.
Деньги. Суммы везде целые в минорных единицах — никаких float. Цены фиксированные на валюту и по курсу не пересчитываются. Драйвер обязан проверять подпись колбэка сам, сверку суммы делает сервис сверху, а сумму из колбэка не принимает на веру никто.
Заказы и подписки. Отдельной сущности «подписка» нет: подписка — это заказ с периодом, сроком, признаком автопродления и токеном привязки. Когда звать продление и снятие истёкших, решает крон сайта, а не компонент.
Чеки 54-ФЗ. Шлюз бьёт чек сам, если умеет; для остальных путей прихода денег есть касса (АТОЛ) с очередью документов и ключом идемпотентности.
Чего pbShop не делает
Вход и регистрацию — этим занимается pbAuth либо сам сайт. Ссылки в шапке витрины берутся из настроек, а если их нет — из именованных маршрутов pbAuth; нет ни того ни другого — ссылки не показываются вовсе. «Войти», ведущий на 404, хуже, чем его отсутствие.
Расписание тоже: dueForRenewal(), renew(), expire(), рассылку подписок на поступление и добор недопечатанных чеков зовёт крон магазина. Компонент даёт методы, но не решает, когда им сработать.