Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save TrywaR/c69879360edf9bc0ce5363c13ec9bfde to your computer and use it in GitHub Desktop.
Save TrywaR/c69879360edf9bc0ce5363c13ec9bfde to your computer and use it in GitHub Desktop.
Ниже плагин, который позволяет хранить корзину клиента в базе данных и сохранять её при разлогировании. При авторизации он суммирует корзину которая была до авторизации с той что сохранена в аккаунте.
<?
switch($modx->event->name) {
# Добавление или удаление товара, расчёт полной цены
case 'OnSHKbeforeCartLoad': # Перед загрузкой корзины, чтобы отследить изменение количества товара, события далее их не могут уловить (:
case 'OnSHKaddProduct': # Добавление товара
case 'OnSHKAfterRemoveProduct': # Удаление товара
# Если пользователь залогинен
$modx->log('Чего то добавили');
$iId = $modx->user->get('id');
if ($iId > 0) {
# Собираем данные
foreach ($_SESSION as $key => $value)
if (strripos($key, 'shk_') === 0)
$arrCart[$key] = $value;
# Перегоняем в данные json
$jsCart = json_encode($arrCart, JSON_UNESCAPED_UNICODE);
# Проверяем есть ли корзина у этого пользователя в базе
$result = $modx->query("SELECT `cart_data` FROM users_cart WHERE user_id=" . $iId);
$arrUsers_cart = $result->fetchAll(PDO::FETCH_ASSOC);
if (count($arrUsers_cart))
# Есть, обновляем
$modx->exec("UPDATE users_cart SET cart_data='".$jsCart."' WHERE user_id=" . $iId);
else
# Нет, добавляем
$modx->exec("INSERT users_cart SET cart_data='".$jsCart."', user_id=" . $iId);
}
break;
# Чистим базу после оформления заказа или чистки корзины
case 'OnSHKsaveOrder':
case 'OnSHKAfterClearCart':
# Если пользователь залогинен, чистим его корзину в базе
$iId = $modx->user->get('id');
if ($iId > 0)
$modx->exec("UPDATE users_cart SET cart_data='' WHERE user_id=" . $iId);
break;
# Наполняем корзину из базы при входе пользователя
case 'OnWebLogin':
# Если пользователь залогинен
$iId = $modx->event->params['user']->id;
if ($iId) {
# Берём значение из базы и декодируем в массив
foreach ($modx->query("SELECT cart_data FROM users_cart WHERE user_id=" . $iId) as $key => $value)
$arrBaseCart = json_decode($value[0],true);
# Были ли в аккаунте пользователя товары
if (count($arrBaseCart['shk_order'])){
# Если в корзине до авторизации тоже были товары
if (count($_SESSION['shk_order'])) {
$arrBaseCartCount = count($arrBaseCart['shk_order']); // Всего товаров в базе, для счётчика
$arrNewsCart = []; // Сюда товары которых в базе
# Перебираем корзину новую корзину из сессии
foreach ($_SESSION['shk_order'] as $arrSessionCartItem){
$index = 0;
# Сравниваем с той что была в аккаунте
foreach ($arrBaseCart['shk_order'] as &$arrBaseCartItem) {
$index++;
if ($arrBaseCartItem['id'] == $arrSessionCartItem['id']){
# Нашли копию, теперь проверяем опции
if (count(array_intersect($arrBaseCartItem['options'], $arrSessionCartItem['options'])) > 1)
# Опции различаются, добавляем товар
$arrNewsCart[] = $arrSessionCartItem;
else
# Не различаются, суммируем колличество
$arrBaseCartItem['count'] = $arrBaseCartItem['count'] + $arrSessionCartItem['count'];
break;
}else
# Не нашли, добавляем
if ($index == $arrBaseCartCount)
$arrNewsCart[] = $arrSessionCartItem;
}
}
# Склеиваем все корзины
$arrBaseCart['shk_order'] = array_merge($arrBaseCart['shk_order'], $arrNewsCart);
}
# Пихаем в сессию то что получилось
foreach ($arrBaseCart as $key => $value)
$_SESSION[$key] = $value;
}
}
break;
}
# Ферштейн? 0_о
@TrywaR
Copy link
Author

TrywaR commented Feb 11, 2019

##Правки в базе
Добавляем таблицу users_cart со столбцами user_id тип INT и cart_data тип LONGTEXT. Там будут храниться корзины пользователей.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment