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 Комментариев
Что-бы оставить свой комментарий Вы должны авторизоваться на сайте
x
Тема пуша
Сообщение пуша
Наверх
Отправить заявку
Нажимая на кнопку, вы даете согласие на обработку своих персональных данных