MiniShop3 для MODX3. Отчет за месяц

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


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

Отказ от хранения корзины в сессии.

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

Теперь, при добавлении первого товара в корзину, в базе данных сразу создается пустой заказ с товаром и все последующие действия просто пополняют этот заказ. Мы уже знакомы с этой системой. Мы с @Павел Гвоздь придумали ее еще в MiniShop2 3.0.0. С тех пор удалось накопить опыт работы с этим вариантом и сделать некоторый апгрейд для MS3

Токен покупателя.

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

А если разработка проекта более сложная, ведется отдельно в каком нибудь VUE приложении и запросы к серверу с заказами происходят удаленно из другого домена. Здесь вообще ад начинается.

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

В MiniShop3 добавлен новый контроллер Customer, который будет отвечать за все действия связанные с покупателем. Ровно тот же принцип, по котором работают контроллеры Корзины, Заказа, Доставки, Оплаты. Конечно же его можно будет расширять и обвешивать собственной логикой.

Контроллер Customer умеет генерировать токены клиентов, и при первом же запуске сайта, сохранять токен в localStorage клиенту. Скорее всего еще и в профиль будем его сохранять, при авторизации, для поддержки нескольких устройств.

Все запросы к главным контроллерам подписываются персональным токеном, который должен передаваться в заголовке запроса. Это дает гарантию защиты от ботов, а также однозначного определения клиента и его текущего заказа. Задумка позволяет кидать запросы откуда угодно. Непосредственно с фронта сайта, из мобильного приложения, из DEV версии, находящейся на другом домене. Запрос независимо от cookies, от капризов сессий дойдет до контроллеров MiniShop3 и вернет данные о нужном заказе.

Серверный рендер корзины.

Это страшное и сложное выражение, на самом деле нам всем хорошо известно своей сутью. Все вы знаете как работает фильтр mFilter2. По мере выбора того или иного фильтра на сервер улетает запрос, который возвращает результат в виде готового html. Тот же принцип работы в pdoPage.

Ну так вот, теперь этот принцип реализован и для корзины MiniShop3. Реализован опционально.
При работе с корзиной, ответ по-прежнему будет содержать сырой массив данных, удобный для фреймворков, а также по желанию можно включить параметр render и получать от сервера готовый html с обновленной корзиной.

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

Для реализации этой задачи нам всегда не хватало именно серверного рендера. Потому решив одну задачу, я смог добиться и решения второй.

Каждый вызываемый в шаблоне сниппет корзины регистрирует себя в системе, генерируя глобальный ключ.
JS скрипт, передавая эти ключи в запросе серверу в параметре render, показывает системе какие именно корзины нужно отрендерить и вернуть.

Изменение опций внутри корзины
Пункты, озвученные выше позволили реализовать еще одну долгожданную опцию. Теперь становится возможно менять опции товара прямо в корзине, и если выбранный комплект опций совпадает с другим пунктом корзины, то комплекты просто суммируются.

Этот пункт доступен и через PHP API. Появился новый метод
$ms2->cart->changeOption($product_key, $options)
JS API
Важное достижение, которого не было раньше это возможность работать совсем без форм, без DOM элементов, добавляя или изменяя товары в корзине через API. К примеру используя консоль.

const formData = new FormData()
formData.append('id', 5)
formData.append('count', 2)
ms3.cart.add(formData)
Как можно заметить, была проделана достаточно большая работа. Мы приближаемся к релизу, осталось отладить систему оформления заказа, и кое-какие моменты, связанные с покупателем.

Хочу сказать большое спасибо за вашу финансовую поддержку. Без нее работа не получалась бы такой эффективной.
Николай Савин
30 сентября 2023, 13:10
modx.pro
1
1 913
+23
Поблагодарить автора Отправить деньги

Комментарии: 14

Баха Волков
30 сентября 2023, 14:45
+2
Ну… Желаю тебе сил и выдержки!
Василий Наумкин
02 октября 2023, 04:28
1
+3
Недавно решал подобную задачу, только сделал немного иначе.

Вместо передачи токена корзины в заголовке, у меня указывается uuid корзины как часть адреса для запроса, типа /api/web/cart/fc30e4d7-ed56-40ec-9f6e-69f1fcd70582.

Оформление заказа так же происходит с указанием uuid корзины /api/web/orders/fc30e4d7-ed56-40ec-9f6e-69f1fcd70582, после чего заказ получает уже собственный uuid, а старая корзина удаляется.

Таким образом, авторизация вообще не нужна, заказ можно создавать и просматривать гостям — главное знать нужные uuid, которые не поддаются перебору.

Теперь становится возможно менять опции товара прямо в корзине, и если выбранный комплект опций совпадает с другим пунктом корзины, то комплекты просто суммируются.
А как эти товары потом разделить обратно, если соединил по ошибке? Разрешать делать что-то, без возможности отмены, мне кажется несовсем правильным.
    Николай Савин
    02 октября 2023, 07:46
    +4
    А как эти товары потом разделить обратно, если соединил по ошибке? Разрешать делать что-то, без возможности отмены, мне кажется несовсем правильным.
    Ну удаление из корзины у нас тоже всегда было без confirm. И ничего страшного. На данный момент то что сделано — это в любом случае прогресс. Сообщество у нас умное, накидает идей и правок, было бы куда.
      Алексей Смирнов
      04 октября 2023, 20:18
      0
      Как вариант, совпадающие цвета сразу не объединять. можно спросить разрешение об обьединении.
      А если по ошибке, то кнопачку можно добавить.
      Но кажется этот весь функционал нафиг нужен в массовом пользовании.
      Артур Шевченко
      02 октября 2023, 22:14
      0
      А как эти товары потом разделить обратно, если соединил по ошибке?
      Тыкать (мышкой) надо осознанно, чтобы не сожалеть потом)))
      Wassi Wassinen
      19 ноября 2023, 06:26
      0
      Николай, спасибо за ваш труд. Вопрос — когда ждать самую сырую альфу? Чтобы уже можно было что-то потестировать в админке, вывести сниппеты и т.д.?
        Николай Савин
        19 ноября 2023, 14:19
        0
        Привет. Вся работа в открытом доступе здесь github.com/modx-pro/MiniShop3
        Дистрибутива готового нет, но если умеешь скачивать и устанавливать компоненты из исходников — то там все так же.

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

        В целом есть что смотреть и тестировать.
          Wassi Wassinen
          19 ноября 2023, 14:38
          0
          Спасибо за ответ. Вы молодцы, все кто работает над MS3. Буду стараться поддерживать не только словом, но и делом.

          Твой пост был в сентябре. Ждал октябрьский. Будешь выпускать новый лонгрид? :)

          Да, эту ссылку на гитхаб видел.
          Получится какой-никакой гайд по самостоятельной сборке прикрутить в ридми файл на гитхаб? Хотя бы в общих чертах. Думаю, много таких как я — сами не знаем что и куда, но по инструкции можем попробовать :)

          Заранее благодарен.
            Андрей
            20 ноября 2023, 03:59
            1
            0
            Получится какой-никакой гайд по самостоятельной сборке прикрутить в ридми файл на гитхаб? Хотя бы в общих чертах. Думаю, много таких как я — сами не знаем что и куда, но по инструкции можем попробовать :)
            Скачать архив файлов из репозитория по кнопке в Code — Download ZIP. Распаковать в корне сайта, и запустить скрипт билдера, к примеру по такому адресу — sitename.ru/MiniShop3-draft/_build/build.php
        антон
        20 мая 2024, 06:21
        0
        MiniShop3 кто подскажет как собрать недавно вышел
        есть по поунктам что бы сайт не поломать
        антон
        20 мая 2024, 06:59
        0
        Fatal error: Uncaught Error: Failed opening required '/var/www/html/modx/core/components/minishop3/vendor/autoload.php' (include_path='.:/usr/share/php') in /var/www/html/modx/core/components/minishop3/src/Controllers/Customer/Customer.php:8 Stack trace: #0 /var/www/html/modx/core/vendor/composer/ClassLoader.php(576): include() #1 /var/www/html/modx/core/vendor/composer/ClassLoader.php(427): Composer\Autoload\{closure}() #2 [internal function]: Composer\Autoload\ClassLoader->loadClass() #3 /var/www/html/modx/core/components/minishop3/src/Utils/Services.php(90): class_exists() #4 /var/www/html/modx/core/components/minishop3/src/MiniShop3.php(302): MiniShop3\Utils\Services->load() #5 /var/www/html/modx/core/cache/includes/elements/modx/revolution/modplugin/18.include.cache.php(49): MiniShop3\MiniShop3->initialize() #6 /var/www/html/modx/core/src/Revolution/modScript.php(88): include('...') #7 /var/www/html/modx/core/src/Revolution/modX.php(1706): MODX\Revolution\modScript->process() #8 /var/www/html/modx/core/src/Revolution/modRequest.php(149): MODX\Revolution\modX->invokeEvent() #9 /var/www/html/modx/core/src/Revolution/modRequest.php(138): MODX\Revolution\modRequest->prepareResponse() #10 /var/www/html/modx/core/src/Revolution/modX.php(1499): MODX\Revolution\modRequest->handleRequest() #11 /var/www/html/modx/index.php(63): MODX\Revolution\modX->handleRequest() #12 {main} thrown in /var/www/html/modx/core/components/minishop3/src/Controllers/Customer/Customer.php on line 8
        после установки
        не понятен кусок кода
        $autoload = dirname(__FILE__, 4). '/vendor/autoload.php';

        require_once($autoload);
        разбираться не стал просто как обычно поставил комент и все заработало
          Николай Савин
          20 мая 2024, 10:13
          0
          MiniShop3 использует компоненты composer, а значит перед установкой нужно запустить композер, чтобы он скачал необходимые для работы компоненты.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          14