Last active
February 16, 2019 15:37
-
-
Save TrywaR/c69879360edf9bc0ce5363c13ec9bfde to your computer and use it in GitHub Desktop.
Ниже плагин, который позволяет хранить корзину клиента в базе данных и сохранять её при разлогировании. При авторизации он суммирует корзину которая была до авторизации с той что сохранена в аккаунте.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<? | |
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_о |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
##Правки в базе
Добавляем таблицу users_cart со столбцами user_id тип INT и cart_data тип LONGTEXT. Там будут храниться корзины пользователей.