loader

Хранение корзины JBZoo не зависимо от сессий joomla для авторизованного пользователя

Очень большая проблема JBZoo в том что он хранит заказы в сессии Joomla и возникает сложность когда авторизованные пользователи собирают корзину заказов после вышли или например зашли с другого браузера то вся корзина теряется, особенно это актуально для сайтов оптовиков т.к.к. у них клиенты формируют заказы на протяжении недели, и с разных устройств/браузеров. Тут и возникает вопрос как это все дело привязать к пользователю, на оф.сайте решения нет по данному вопросу а он возник у нескольких клиентов вот и решаем данный вопрос:

Идем в файл:

\media\zoo\applications\jbuniversal\framework\classes\cart\jbcart.php

В нем будем работать с двумя функциями _getSession(получение данных корзины) и _setSession(запись в сессию корзины), но еще не маловажный момент нам нужно оставить возможность работы с корзиной и обычных юзеров не авторизованных. Далее просто копируем обе функции вместо дефолтных (описывать каждую строчку не буду кто понимаем в php сам разберется а кто нет лучше и не делать этого:))

protected function _getSession(){ $session = JFactory::getSession(); $result = $session->get($this->_sessionNamespace, array(), $this->_namespace); $user =& JFactory::getUser(); $user_id = $user->get('id'); if($user_id){ $db =& JFactory::getDBO(); $query="SELECT data FROM #__basketuser WHERE userid='$user_id' "; $db->setQuery($query); $datavalue = $db->loadObject(); $resbd = json_decode($datavalue->data,true); return $this->app->data->create($resbd); }else{ return $this->app->data->create($result); }
}
protected function _setSession($key, $value){ $session = JFactory::getSession(); $result = $session->get($this->_sessionNamespace, array(), $this->_namespace); $result[$key] = $value; $user =& JFactory::getUser(); $user_id = $user->get('id'); if($user_id){ $db =& JFactory::getDBO(); $res_bd = json_encode($result, JSON_UNESCAPED_UNICODE); $res_bd = addslashes($res_bd); $query="SELECT id FROM #__basketuser WHERE userid='$user_id' "; $db->setQuery($query); $datavalue = $db->loadResult(); if(!$datavalue){ $sql = " INSERT INTO #__basketuser (`userid`, `data`) VALUES ('$user_id', '$res_bd') "; $db->setQuery($sql); if(!$db->query()) { echo __LINE__.$db->stderr(); } }else{ $sql = "UPDATE #__basketuser SET data='$res_bd' WHERE userid='$user_id'"; $db->setQuery($sql); if(!$db->query()) { echo __LINE__.$db->stderr(); } } } $session->set($this->_sessionNamespace, $result, $this->_namespace);
}

Параллельно создаем таблицу в базе сайта с именем basketuser и тремя полями (id, userid,data), только учтите тип полей для каждых данных особенно data

Все теперь у нас хранятся все данные корзины пользователя до момента его оформления в заказ, и нет зависимости не от сессии не от браузера и т.д.

P.S. а и нам же нужно удалить эти данные после совершения заказа. Но тут исхитрятся не стали а используем события самого jbzoo и повесили удаление в момент отправки E-Mail после сохранения заказа

$user =& JFactory::getUser();
$user_id = $user->get('id');
$db =& JFactory::getDBO();
$query="DELETE FROM #__basketuser WHERE userid='$user_id' ";
$db->setQuery($query);
if(!$db->query()){ echo __LINE__.$db->stderr();
}

Можно конечно отдельно написать хук но на данном этапе такой задачи не стояло.

P.S.S. Данное решение, точнее его логику можно доработать и более функционально (что наверняка и сделаем:)) например перенести полностью в бд корзину и не от авторизованных пользователей, подтягивать ее при регистрации в общем все так же как на ТОПовых инет магазинах.

0 Комментариев
Что-бы оставить свой комментарий Вы должны авторизоваться на сайте