CartModel и TempcartModel - ошибка логики?

26.01.2024 15:13
#1
sergeytolkachyov
User sergeytolkachyov
Name: Sergey
11.10.2019
Сообщения: 110
Quote
CartModel и TempcartModel - ошибка логики?

Обнаружил, может быть неточность в логике, которая приводит к тому, что таблица для брошенных корзин засоряется дублями данных. Типичный кейс - положили в корзину, закрыли браузер, открыли браузер спустя время, зашли на сайт - всё лежит в корзине, как должно. Но если посмотреть на таблицу #__jshopping_cart_temp, то в ней будет 2 разных сессии с одинаковыми корзинами.

Почему так происходит?
В методе CartModel - load() происходит проверка на наличие куки для брошенной корзины в методе loadProductsFromTempCart().

function loadProductsFromTempCart(){
$tempcart = \JSFactory::getModel($this->model_temp_cart, 'Site');
if (!count($this->products) && $tempcart->getIdTempCart() && $tempcart->checkAccessToTempCart($this->type_cart)){

/**
* из старой куки получаем Id старой сессии и
* по этому id загрузили из базы данных старую корзину
*/

$products = $tempcart->getProducts($this->type_cart);
if (count($products)){
// Если там не пусто - присваиваем
$this->products = $products;
// и сохраняем
$this->saveToSession();
}
}
}

Вроде всё нормально. НО! Немалая часть шевелений в CartModel проходит через метод saveToSession(), который вызывает метод insertTempCart() модели TempcartModel. Цитирую 2 метода:


function getUniqId(){
return session_id();
}

function insertTempCart($cart){
// Проверяем всё можно сохранять корзину
if (!$this->checkAccessToTempCart($cart->type_cart)){
return 0;
}
// И вот собака зарыта - получаем id ТЕКУЩЕЙ сессии - то есть новой
$id = $this->getUniqId();
$this->setIdTempCart($id);
$this->delete($id, $cart->type_cart);
if (!count($cart->products)){
return 0;
}
$this->save($id, $cart->type_cart, $cart->products);
return 1;
}


Получается, что в рамках одной сессии всё происходит как надо: по id текущей сессии корзина обновляется, удаляется и т.д. Но если сессии разные, то база данных замусорится брошенными корзинами одного пользователя. При этом использоваться, конечно, будет только последняя - актуальная. Но база данных при этом разрастётся.


Joomla: 5.0.2
JoomShopping: 5.2.1

Joomla developer. https://web-tolk.ru JoomShopping Bitrix24 integration, custom developing.
 
29.01.2024 12:36
#2
sergeytolkachyov
User sergeytolkachyov
Name: Sergey
11.10.2019
Сообщения: 110
Quote
Aw: CartModel и TempcartModel - ошибка логики?

Увидел, что в 5.3.0 изменено поведение.


Joomla developer. https://web-tolk.ru JoomShopping Bitrix24 integration, custom developing.
 
29.01.2024 12:48
#3
admin
(Support Team)
User admin
Name: Admin
05.08.2010
Сообщения: 25941
Quote
Aw: CartModel и TempcartModel - ошибка логики?

#__jshopping_cart_temp - только для wishlist.

Проблема в старой версии JoomShopping.

 
29.01.2024 17:07
#4
sergeytolkachyov
User sergeytolkachyov
Name: Sergey
11.10.2019
Сообщения: 110
Quote
Aw: CartModel и TempcartModel - ошибка логики?

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


Joomla developer. https://web-tolk.ru JoomShopping Bitrix24 integration, custom developing.
 
29.01.2024 17:08
#5
sergeytolkachyov
User sergeytolkachyov
Name: Sergey
11.10.2019
Сообщения: 110
Quote
Aw: CartModel и TempcartModel - ошибка логики?

Спасибо.


Joomla developer. https://web-tolk.ru JoomShopping Bitrix24 integration, custom developing.
 


Copyrights MAXXmarketing GmbH. Alle Rechte vorbehalten
Durch die Nutzung dieser Website stimme ich zu, dass Cookies zur optimalen Gestaltung der Website sowie zur Analyse der Nutzung der Website verwendet werden. Weiterführende Informationen finden Sie hier. OK, einverstanden.