Переезд с miniShop2 на Vesp

Запуск в продакшн с помощью Docker

С тех пор, как я перешёл на разработку в Docker, моя программистская жизнь не будет прежней. Настолько это оказалось удобно, что словами не передать!

Любые версии PHP, любые версии Node, локальная отладка отправленных писем и т.д. Подключить можно какие угодно службы, для всяких разных нужд.

Естественно, мне захотелось перенести этот опыт и в боевой режим на сервере, чтобы мои контейнеры так же замечательно работали в продакшене.

Как оказалось, сделать это совсем несложно. Нужен только VPS, куда вы сможете установить Docker.

Читать далее

Личный кабинет пользователя

Товары есть, заказы есть, оплата есть... Осталось только вывести пользователю историю его заказов со статусом оплаты.

Заодно можно и отобразить оплату в админке. На этом, полагаю, с основным функционалом мы закончим.

В этой заметке не будет практически никакой новой информации, потому что всё это мы уже делали много раз: создадим контроллеры, пропишем маршруты, сделаем странички на сайте и выведем нужные данные.

Но, тем не менее, коротенько расскажу про создание личного кабинета для пользователя.

Читать далее

Оплата заказа

Оформление заказа у нас уже есть, пора добавить оплату.

Здесь мы заложим общие правила работы оплаты, причём сразу двумя способами: через редирект, и через вывод QR кода для сканирования.

Напишем интерфейс для платёжных провайдеров с общими методами, которые они должны будут реализовывать.

За оплату с редиректом у нас отдувается Yookassa, а за приём платежей через СБП банк Raiffeisen.

Читать далее

Оформление заказа

Сегодня пишем оформление заказа, пока без оплаты.

Тут не очень много изменений, по сравнению с прошлой версией. В основном, работа с пользователями и их адресами.

Например, мне хочется дать возможность юзерам авторизоваться прямо в корзине, а потом выбрать свой адрес доставки из истории заказов.

Читать далее

Регистрация с авторизацией и сбросом пароля

Мы вплотную подошли к оформлению заказов, но тут есть загвоздка - нам нужно регистрировать покупателя, потому что адрес доставки привязывается к его модели.

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

Чем сегодня и займёмся.

Читать далее

Хранение корзины в базе данных

С каталогом товаров мы пока закончили, пора переделать работу с корзиной. В прошлой версии магазина она хранилась в localStorage браузера, теперь же будет храниться в БД.

На публичном сайте пока нет авторизации, да и не каждому магазину она нужна, поэтому доступ к корзине пользователя будет по уникальному идендификатору uuid.

Теперь в localStorage останется только идентификатор, а добавленые товары переедут в базу данных.

Пишем новую миграцию.

Читать далее

Фасетные фильтры

Сегодня вы узнаете как сделать свой собственный фасетный фильтр и не поехать кукухой.

Когда-то я провёл очень много времени изобретая подобные фильтры для MODX под названием mFilter. Честно говоря, я и не знал, что это именно фасетные фильтры.

Решение моё стало популярным, и теперь кажется, что ни один магазин без подобных фильтров существовать не может.

mFilter очень сильно завязан на MODX, поэтому для Vesp я использую замечательный пакет от российского автора k-samuel/faceted-search.

Читать далее

Хлебные крошки и мультикатегории

Сегодня продолжаем работать с выводом товаров на сайте - у нас осталась пара незаконченых дел.

Во-первых, у нас нет вывода товаров, вложенных в дочерние категории. И поддержки товаров, привязанных через ProductCategory тоже нет. Через это, например, большая категория /products/tabak выводится пустой.

Во-вторых, хлебные крошки умеют выводить только непосредственно родительскую категорию товара, без цепочки остальных категорий до корня сайта.

Надо это исправить.

Читать далее

Вывод товаров по uri

Сегодня мы обновляем публичный сайт с выводом товаров.

Нам нужно добавить работу с переводами, утилиты для вывода переводов и цен, а также научиться выводить товары по адресам с неизвестной глубиной вложения.

В предыдущей версии у нас вообще не было вложенных категорий, поэтому структура сайта была чётко прописана: категория и в ней товар. Сейчас же может быть категория\категория\категория\товар - и поэтому вывод товаров должен стать гораздо гибче.

Для начала просто починим вывод текущего каталога, который сломался из-за отсутствия колонки title - она теперь в отдельной таблице. Мы можем или присоединять таблицу переводов в контроллере, чтобы сохранить сортировку, или поменять её на дату публикации.

Я выбираю второй вариант, потому что сейчас нам нужно только починить вывод, а дальше мы его доработаем.

Меняем title на created_at в следующих файлах:

  • site/pages/index.vue
  • site/components/list-products-actions.vue

И вывод товаров уже работает:

Читать далее

Импорт и управление заказами

Сегодня продолжаем прогружать старые данные в новую базу - дошла очередь и до заказов.

Помимо собственно заказов, miniShop2 хранит ссылки на купленные товары и адреса доставки покупателей. Изначально в нём планировалось сделать выбор адреса при новом заказе, чтобы старый покупатель не вводил его каждый раз, но в стандартный функционал это так и не вошло.

В VespShop мы это исправим.

Читать далее

Связи товара и мультикатегории

Продолжаем улучшать админку.

Сегодня вы переделаем карточку товара таким образом, чтобы добавить в неё вкладки с галереей, связями и категориями - это будет удобнее отдельных кнопок в таблице.

Галерея переедет как есть, а связи и категории товара напишем вместе с новыми контроллерами.

Читать далее

Сортировка моделей и генерация uri

Возможно вы обратили внимание, что при создании категории в нашей прошлой заметке, она получалась с rank = 0, и выводилась вверху дерева.

Это потому, что у модели категории, как и у прочих моделей, не прописана логика выставления этого самого rank. И сейчас мы её пропишем.

А потом подумаем, как обновлять uri категорий и товаров при перемещении в дереве.

Читать далее
bezumkin
Василий Наумкин
09.04.2024 01:45
Ошибка 500 Это не похоже на ошибку Nginx, это скорее всего ошибка PHP - надо смотреть его логи. Во...
futuris
Futuris
04.04.2024 05:56
Я просто немного запутался. Когда в абзаце "Vesp/Core" ты пишешь про "новый trait Fil...
bezumkin
Василий Наумкин
20.03.2024 18:21
Volledig!
Андрей
14.03.2024 10:47
Василий! Как всегда очень круто! Моё почтение!
russelgal
russel gal
09.03.2024 17:17
А этот стоило написать хотя бы затем, чтобы получить комментарий от юзера, который ничего не писал ...
inetlover
Александр Наумов
27.01.2024 00:06
Василий, спасибо! Извини, тупанул.
bezumkin
Василий Наумкин
22.01.2024 04:43
Давай-давай!
bezumkin
Василий Наумкин
24.12.2023 11:26
Спасибо!
bezumkin
Василий Наумкин
27.11.2023 02:43
Ура!
bezumkin
Василий Наумкин
25.11.2023 08:30
Vesp тянет 2 зависимости: vesp-frontent для фронта и vesp-core для бэкенда. Их можно обновлять, но э...