Сохранение корзины пользователя

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

В качестве решения получился очень простой плагин, который выполняет 2 действия:

  1. Сохраняет содержимое корзины в extended поля пользователя после каждого изменения корзины
  2. Восстанавливает содержимое корзины перед каждой обработкой запрошенной страницы.

Возможно, появится вопрос, почему реальная корзина переписывается при каждой обработке страницы и почему нельзя это сделать только при авторизации? 
В качестве ответа ситуация:

  1. На одном компьютере пользователь добавил капкейк и торт
  2. На втором компьютере удалил торт и добавил макаруны
  3. При возвращении на первый ПК в корзине окажутся капкейк и макаруны

По коду плагина понятно, какие события нужно активировать в его свойствах.

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;
}

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

Дата публикации: 2016-08-08 19:25:23
G+

Закрыть

Вернуться

Вернуться

Обратный звонок