Сохранение корзины для пользователей
На одном из проектов появилась задача сохранять содержимое корзины для зарегистрированных пользователей, чтобы при последующей авторизации с любого компьютера они имели возможность продолжить покупки, а не добавлять все заново.
В качестве решения получился очень простой плагин, который выполняет 2 действия:
1) Сохраняет содержимое корзины в extended поля пользователя после каждого изменения корзины
2) Восстанавливает содержимое корзины перед каждой обработкой запрошенной страницы.
Возможно, появится вопрос, почему реальная корзина переписывается при каждой обработке страницы и почему нельзя это сделать только при авторизации?
В качестве ответа ситуация:
1) На одном компьютере пользователь добавил капкейк и торт
2) На втором компьютере удалил торт и добавил макаруны
3) При возвращении на первый ПК в корзине окажутся капкейк и макаруны
По коду плагина понятно, какие события нужно активировать в его свойствах.
Еще можно добавить сравнение текущего состояния корзины с имеющейся в профиле на случай авторизации при заполненной корзине, но это уже индивидуально.
Оформлять пакет из такого плагина бессмысленно, но если в комментариях идея будет поддержана и развита, возможно появление более функционального варианта в виде компонента.
В качестве решения получился очень простой плагин, который выполняет 2 действия:
1) Сохраняет содержимое корзины в extended поля пользователя после каждого изменения корзины
2) Восстанавливает содержимое корзины перед каждой обработкой запрошенной страницы.
Возможно, появится вопрос, почему реальная корзина переписывается при каждой обработке страницы и почему нельзя это сделать только при авторизации?
В качестве ответа ситуация:
1) На одном компьютере пользователь добавил капкейк и торт
2) На втором компьютере удалил торт и добавил макаруны
3) При возвращении на первый ПК в корзине окажутся капкейк и макаруны
По коду плагина понятно, какие события нужно активировать в его свойствах.
<?php
switch($modx->event->name) {
case 'msOnAddToCart':
case 'msOnChangeInCart':
case 'msOnEmptyCart':
case 'msOnRemoveFromCart':
if ($user = $modx->getAuthenticatedUser('web') and $ms2 = $modx->getService('minishop2')) {
$ms2->initialize($modx->context->key);
$profile = $user->getOne('Profile');
$extended = $profile->get('extended');
$extended['ms2cart'] = $ms2->cart->get();
$profile->set('extended', $extended);
$profile->save();
}
break;
case 'OnWebPageInit':
case 'OnWebLogin':
if ( $user = $modx->getAuthenticatedUser('web') and $ms2 = $modx->getService('minishop2')) {
$ms2->initialize($modx->context->key);
$profile = $user->getOne('Profile');
$extended = $profile->get('extended');
if ( isset($extended['ms2cart']) && !empty($extended['ms2cart']) ) {
$ms2->cart->set($extended['ms2cart']);
}
}
break;
}Еще можно добавить сравнение текущего состояния корзины с имеющейся в профиле на случай авторизации при заполненной корзине, но это уже индивидуально.
Оформлять пакет из такого плагина бессмысленно, но если в комментариях идея будет поддержана и развита, возможно появление более функционального варианта в виде компонента.
Комментарии: 13
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
В качестве расширения функционала:
— отправлять посетителю на почту письмо с содержимым корзины в автоматическом или ручном режиме.
Если мы формируем заказ будучи не авторизованными, а потом авторизовываемся на странице оформления заказа, то корзина заменяется и мы теряем товары, которые только что сложили.
Для исправления необходимо чуть поправить событие OnWebLogin
Хорошим решением будет отличать устройства, если же устройства одни и те же — то корзину не восстанавливать! Иначе восстановить.