Модуль Сохранение корзины в базе

Доброго времени суток!
Есть ли у кого-нибудь модуль записи корзины в базу данных?

Держи

1. SQL

Код:
create table s_carts (code varchar(255) not null, user_id int(11), cart text, primary key (user_id, code)) default charset=utf8



2. api/Cart.php

2.1. В конце перед заключительным "}" вставить

Код:
public function cart_to_base()
{
$query = $this->db->placehold("DELETE FROM __carts WHERE code=?", $_COOKIE['shopping_cart_code']);
$this->db->query($query);
if($_SESSION['user_id']){
$query = $this->db->placehold("DELETE FROM __carts WHERE user_id=?", $_SESSION['user_id']);
$this->db->query($query);
} 

if($_SESSION['shopping_cart']){
$query = $this->db->placehold("INSERT IGNORE INTO __carts SET code=?, user_id=?, cart=?", $_COOKIE['shopping_cart_code'], 0, serialize((array)$_SESSION['shopping_cart']));
$this->db->query($query);
if($_SESSION['user_id']){
$query = $this->db->placehold("INSERT IGNORE INTO __carts SET code=?, user_id=?, cart=?", '', $_SESSION['user_id'], serialize((array)$_SESSION['shopping_cart']));
$this->db->query($query);
} 
}
}


public function base_to_cart($param, $add='max')
{
if(empty($param)) return;

// $this->db->query("SELECT cart FROM __carts WHERE code=? OR user_id=? LIMIT 1", $param, $param);
$this->db->query("SELECT cart FROM __carts WHERE code=? OR (user_id>0 AND user_id=?) LIMIT 1", $param, $param);

if($c=$this->db->result('cart'))
$bcs = unserialize($c);

if ($bcs){
if($add=='max'){
if(is_array($bcs))foreach ($bcs as $variant_id => $amount) {
if(isset($_SESSION['shopping_cart'][$variant_id]))
$_SESSION['shopping_cart'][$variant_id]=max($_SESSION['shopping_cart'][$variant_id], (int)$amount);
else
$_SESSION['shopping_cart'][$variant_id]=$amount;
}
}else
$_SESSION['shopping_cart']=$bcs;
}
$this->check_cart();
}


public function check_cart()
{
$sc=(array)$_SESSION['shopping_cart'];
$variant_ids=array_keys($sc);

if(empty($variant_ids))
return;

$_SESSION['shopping_cart']=array(); 

$variants=$this->variants->get_variants(array('id' => $variant_ids));
if(is_array($variants))foreach ($variants as $variant) {
$vids[]=$variant->id;
}

if(is_array($variants))foreach ($variants as $variant) {
$id=$variant->id;
if(!($sc[$id]>0))continue;

if($variant->infinity)
$_SESSION['shopping_cart'][$id]=$sc[$id]; 
elseif($sc[$id]<=$variant->stock)
$_SESSION['shopping_cart'][$id]=$sc[$id]; 
elseif($variant->stock>0)
$_SESSION['shopping_cart'][$id]=$variant->stock; 
}

}






2.2. в 2-х местах
после
Код:
// Если товар существует, добавим его в корзину
if(!empty($variant) && ($variant->stock>0) )
{
// Не дадим больше чем на складе
$amount = min($amount, $variant->stock);

$_SESSION['shopping_cart'][$variant_id] = intval($amount);

вставить

Код:
$this->cart_to_base();


2.3.
после
Код:
unset($_SESSION['shopping_cart'][$variant_id]);
вставить
Код:
$this->cart_to_base();


2.4.
после
Код:
unset($_SESSION['shopping_cart']);
unset($_SESSION['coupon_code']);
вставить

Код:
$this->cart_to_base();


2.5.
после
Код:
public function get_cart()
{
$cart = new stdClass();
$cart->purchases = array();
$cart->total_price = 0;
$cart->total_products = 0;
$cart->coupon = null;
$cart->discount = 0;
$cart->coupon_discount = 0;

вставить

Код:
if(!isset($_COOKIE['shopping_cart_code'])){
$sid=session_id();
$_COOKIE['shopping_cart_code']=$sid;
setcookie("shopping_cart", $sid, time()+365*24*3600, '/');
$this->cart->base_to_cart($_COOKIE['shopping_cart_code']);
}






3. view/LoginView.php - в 2-х местах

после
Код:
$_SESSION['user_id'] = $user_id;

вставить

Код:
$this->cart->base_to_cart($user_id);
$this->cart->cart_to_base();

4. view/RegisterView.php


после
Код:
$_SESSION['user_id'] = $user_id;

вставить

Код:
$this->cart->base_to_cart($user_id);
$this->cart->cart_to_base();
 
Установил модуль и нашел одну ошибку, при добавлении двух вариантов одного товара перестают записываться id вариантов в поле cart БД. Такая ошибка только у неавторизованного пользователя, при авторизации такой ошибки нет. Кто знает как исправить подскажите пожалуйста?

Разобрался как решить проблему: необходимо добавить в конце $this->cart_to_base(); в функцию

Код:
public function base_to_cart($param, $add='max')
{
if(empty($param)) return;

// $this->db->query("SELECT cart FROM __carts WHERE code=? OR user_id=? LIMIT 1", $param, $param);
$this->db->query("SELECT cart FROM __carts WHERE code=? OR (user_id>0 AND user_id=?) LIMIT 1", $param, $param);

if($c=$this->db->result('cart'))
$bcs = unserialize($c);

if ($bcs){
if($add=='max'){
if(is_array($bcs))foreach ($bcs as $variant_id => $amount) {
if(isset($_SESSION['shopping_cart'][$variant_id]))
$_SESSION['shopping_cart'][$variant_id]=max($_SESSION['shopping_cart'][$variant_id], (int)$amount);
else
$_SESSION['shopping_cart'][$variant_id]=$amount;
}
}else
$_SESSION['shopping_cart']=$bcs;
}
$this->check_cart();
$this->cart_to_base();
}
 
Последнее редактирование модератором:
Вот с этим: $variant_id не совсем ясно, поясните пожалуйста.
 
после добавления товара в корзину, не появляется количество, нужно обновить страницу и тогда появится. Как исправить?

Держи

1. SQL

Код:
create table s_carts (code varchar(255) not null, user_id int(11), cart text, primary key (user_id, code)) default charset=utf8



2. api/Cart.php

2.1. В конце перед заключительным "}" вставить

Код:
public function cart_to_base()
{
$query = $this->db->placehold("DELETE FROM __carts WHERE code=?", $_COOKIE['shopping_cart_code']);
$this->db->query($query);
if($_SESSION['user_id']){
$query = $this->db->placehold("DELETE FROM __carts WHERE user_id=?", $_SESSION['user_id']);
$this->db->query($query);
}

if($_SESSION['shopping_cart']){
$query = $this->db->placehold("INSERT IGNORE INTO __carts SET code=?, user_id=?, cart=?", $_COOKIE['shopping_cart_code'], 0, serialize((array)$_SESSION['shopping_cart']));
$this->db->query($query);
if($_SESSION['user_id']){
$query = $this->db->placehold("INSERT IGNORE INTO __carts SET code=?, user_id=?, cart=?", '', $_SESSION['user_id'], serialize((array)$_SESSION['shopping_cart']));
$this->db->query($query);
}
}
}


public function base_to_cart($param, $add='max')
{
if(empty($param)) return;

// $this->db->query("SELECT cart FROM __carts WHERE code=? OR user_id=? LIMIT 1", $param, $param);
$this->db->query("SELECT cart FROM __carts WHERE code=? OR (user_id>0 AND user_id=?) LIMIT 1", $param, $param);

if($c=$this->db->result('cart'))
$bcs = unserialize($c);

if ($bcs){
if($add=='max'){
if(is_array($bcs))foreach ($bcs as $variant_id => $amount) {
if(isset($_SESSION['shopping_cart'][$variant_id]))
$_SESSION['shopping_cart'][$variant_id]=max($_SESSION['shopping_cart'][$variant_id], (int)$amount);
else
$_SESSION['shopping_cart'][$variant_id]=$amount;
}
}else
$_SESSION['shopping_cart']=$bcs;
}
$this->check_cart();
}


public function check_cart()
{
$sc=(array)$_SESSION['shopping_cart'];
$variant_ids=array_keys($sc);

if(empty($variant_ids))
return;

$_SESSION['shopping_cart']=array();

$variants=$this->variants->get_variants(array('id' => $variant_ids));
if(is_array($variants))foreach ($variants as $variant) {
$vids[]=$variant->id;
}

if(is_array($variants))foreach ($variants as $variant) {
$id=$variant->id;
if(!($sc[$id]>0))continue;

if($variant->infinity)
$_SESSION['shopping_cart'][$id]=$sc[$id];
elseif($sc[$id]<=$variant->stock)
$_SESSION['shopping_cart'][$id]=$sc[$id];
elseif($variant->stock>0)
$_SESSION['shopping_cart'][$id]=$variant->stock;
}

}






2.2. в 2-х местах
после
Код:
// Если товар существует, добавим его в корзину
if(!empty($variant) && ($variant->stock>0) )
{
// Не дадим больше чем на складе
$amount = min($amount, $variant->stock);

$_SESSION['shopping_cart'][$variant_id] = intval($amount);

вставить

Код:
$this->cart_to_base();


2.3.
после
Код:
unset($_SESSION['shopping_cart'][$variant_id]);
вставить
Код:
$this->cart_to_base();


2.4.
после
Код:
unset($_SESSION['shopping_cart']);
unset($_SESSION['coupon_code']);
вставить

Код:
$this->cart_to_base();


2.5.
после
Код:
public function get_cart()
{
$cart = new stdClass();
$cart->purchases = array();
$cart->total_price = 0;
$cart->total_products = 0;
$cart->coupon = null;
$cart->discount = 0;
$cart->coupon_discount = 0;

вставить

Код:
if(!isset($_COOKIE['shopping_cart_code'])){
$sid=session_id();
$_COOKIE['shopping_cart_code']=$sid;
setcookie("shopping_cart", $sid, time()+365*24*3600, '/');
$this->cart->base_to_cart($_COOKIE['shopping_cart_code']);
}






3. view/LoginView.php - в 2-х местах

после
Код:
$_SESSION['user_id'] = $user_id;

вставить

Код:
$this->cart->base_to_cart($user_id);
$this->cart->cart_to_base();

4. view/RegisterView.php


после
Код:
$_SESSION['user_id'] = $user_id;

вставить

Код:
$this->cart->base_to_cart($user_id);
$this->cart->cart_to_base();
а как сделать для пользователя? Если пользователь авторизиривон то тоже сохранить его в БД?
 
Последнее редактирование:
а как сделать для пользователя? Если пользователь авторизиривон то тоже сохранить его в БД?
В пункте 2.1 уже сделано для зарегистрированных пользователей.
PHP:
$_SESSION['user_id']
- идентификатор зарегистрированного пользователя.
 
В пункте 2.1 уже сделано для зарегистрированных пользователей.
PHP:
$_SESSION['user_id']
- идентификатор зарегистрированного пользователя.
Значит не работает.
Логирование не сохраняется
 
Значит не работает.
Логирование не сохраняется
  1. Следует ли это понимать так, что код выполняется, ошибки на экране не появляются. Правильно?
  2. Хочу уточнить
    Логирование не сохраняется
    это значит, что в таблице s_carts не существует строки, в которой столбец user_id равен id зарегистрированного пользователя. Правильно?
  3. Или строка в таблице s_carts, в которой столбец user_id равен id зарегистрированного пользователя, существует, но ее содержимое не отображается в корзине?
 
Назад
Сверху