Перейти к содержимому


Фото
- - - - -

Срок хранение товаров в корзине


  • Чтобы отвечать, сперва войдите на форум
25 ответов в теме

#1 artve

artve
  • Пользователь
  • 21 сообщений

Опубликовано 23.12.2013 - 10:20

Добрый день, подскажите сколько времени хранятся товары в корзине и как это можно регулировать? Заметил что через день-два пропадают и никак не пойму с чем связанно (симпла вся в доработках, может по дефолту дольше хранятся). Очень важная штука для ремаркетинга, хотелось бы установить время хранения месяц-полтора. Сесии на сервере хранятся, куки вроде пишутся.



#2 tsybart

tsybart
  • Пользователь
  • 222 сообщений

Опубликовано 31.03.2016 - 11:31

ап

 

Кто-то знает как решить вопрос?



#3 Noxter

Noxter

    Simpla Developer

  • Фрилансер
  • 6 973 сообщений
  • Дизайн, Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Киев

Опубликовано 31.03.2016 - 11:35

ап
 
Кто-то знает как решить вопрос?

Товары в корзине хранятся в сессии.
У меня есть доработка которая хранит все товары в куки скажем на год.

#4 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 31.03.2016 - 12:12

http://simpla-tuning...ny-polzovatelya



#5 mishanya

mishanya
  • Фрилансер
  • 2 557 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 31.03.2016 - 12:14

ап

 

Кто-то знает как решить вопрос?

 

писать свое решение или заказать у кого-то), вчера сделал для клиента сохранение в базе корзины для пользователя и в кукис на год для гостей. если интересно пишите в личку



#6 KostyanBr

KostyanBr
  • Пользователь
  • 75 сообщений
  • Заказчик, Пользователь

Опубликовано 31.03.2016 - 13:14

писать свое решение или заказать у кого-то), вчера сделал для клиента сохранение в базе корзины для пользователя и в кукис на год для гостей. если интересно пишите в личку

Интересно. Писал в скайп - в ответ тишина.



#7 mishanya

mishanya
  • Фрилансер
  • 2 557 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 31.03.2016 - 13:46

Интересно. Писал в скайп - в ответ тишина.


Я с телефона сейчас тут 3г не очень что-то со скайпом дружит

#8 Andrey Terkin

Andrey Terkin
  • Фрилансер
  • 77 сообщений
  • Программирование, Верстка

Опубликовано 01.04.2016 - 20:48

По сути сессионная корзина, в стандартной симпле, используется только в одном файле - это api/Cart.php.

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

Не забудьте сделать себе копию старого файла Cart.php

Итак приступим.

 

1. Нам понадобится два свойства:

    - $shopping_cart - для хранения корзины в классе

    - $save_period - в ней будет период в днях хранения корзины

 

Объявим наши свойства в классе и для свойства Cart::$save_period зададим значение, у примеру 7 дней

class Cart extends Simpla
{
    /**
     * Корзина в формате $variant_id => $amount    
     * @var array
     */
    private $shopping_cart;              
    
    /**
     * Период хранения корзины в днях
     * @var integer     
     */
    private $save_period = 7;              
    
    ............................................

Изменено: Andrey Terkin, 01.04.2016 - 23:24


#9 Andrey Terkin

Andrey Terkin
  • Фрилансер
  • 77 сообщений
  • Программирование, Верстка

Опубликовано 01.04.2016 - 20:57

2. Добавим конструктор в наш класс в котором мы получим содержимое нашей корзины из кук, а также сразу пересчитаем наш период из дней в секунды

 

public function __construct()
    {
    	parent::__construct();
        
        $this->shopping_cart = empty($_COOKIE['shopping_cart']) ? array() : unserialize($_COOKIE['shopping_cart']);
        
        $this->save_period *= 24*3600;                                
    }

Изменено: Andrey Terkin, 01.04.2016 - 23:24


#10 Andrey Terkin

Andrey Terkin
  • Фрилансер
  • 77 сообщений
  • Программирование, Верстка

Опубликовано 01.04.2016 - 21:11

3. Далее нам необходимо пройтись по всему файлу, и заменить обращения к сессионной корзине на обращение к свойству класса Cart::$shopping_cart и сохранение значений в сессии на сохранение значений в куках

3.1 Заменяем проверку на пустоту в сессионной корзине на проверку нашего свойства {Cart::get_cart()}:

    Было:

if(!empty($_SESSION['shopping_cart']))
		

Стало:

if(!empty($this->shopping_cart))

 

Было:

$session_items = $_SESSION['shopping_cart'];

Стало:

$session_items = $this->shopping_cart;

 

3.2 Добавлять товары в корзину тоже нужно будет несколько иначе { Cart::add_item() }.

Заменяем добавление:

if(isset($_SESSION['shopping_cart'][$variant_id]))
    $amount = max(1, $amount+$_SESSION['shopping_cart'][$variant_id]);

На новое:

if(isset($this->shopping_cart[$variant_id]))
    $amount = max(1, $amount+$this->shopping_cart[$variant_id]);

 

Сохранять будем корзину следующим образом, вмсето:


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

сохраняем так:

$this->shopping_cart[$variant_id] = intval($amount); 
            setcookie('shopping_cart', serialize($this->shopping_cart), time() + $this->save_period, '/');

 

3.3 По аналогии с предыдущим пунктом изменяем сохранение корзины в методе { Cart::update_item }

Было:

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

Сделаем так:

$this->shopping_cart[$variant_id] = intval($amount); 
setcookie('shopping_cart', serialize($this->shopping_cart), time() + $this->save_period, '/');

3.4 Далее займемся правильным удалением товаров из корзины { Cart::delete_item() }

Для этого заменим код:

unset($_SESSION['shopping_cart'][$variant_id]); 

На такой:

unset($this->shopping_cart[$variant_id]); 
setcookie('shopping_cart', serialize($this->shopping_cart), time() + $this->save_period, '/');

 

3.5 и последний метод который нужно изменить это { Cart::empty_cart() }

Заменим старый код очищения сессинной корзины:

unset($_SESSION['shopping_cart']);

На новый код для корзины на куках:

$this->shopping_cart = array();
setcookie('shopping_cart', null);

Изменено: Andrey Terkin, 01.04.2016 - 21:26


#11 Andrey Terkin

Andrey Terkin
  • Фрилансер
  • 77 сообщений
  • Программирование, Верстка

Опубликовано 01.04.2016 - 21:23

Файл выложить у меня не вышло, поэтому  помещаю код файла api/Cart.php с изменениями сюда

<?php

/**
 * Simpla CMS
 *
 * @copyright	2011 Denis Pikusov
 * @link		http://simplacms.ru
 * @author		Denis Pikusov
 *
 */
 
require_once('Simpla.php');

class Cart extends Simpla
{
    /**
     * Корзина в формате $variant_id => $amount    
     * @var array
     */
    private $shopping_cart;              
    
    /**
     * Период хранения корзины
     * @var integer     
     */
    private $save_period = 7;              
    
    public function __construct()
    {
    	parent::__construct();
        
        $this->shopping_cart = empty($_COOKIE['shopping_cart']) ? array() : unserialize($_COOKIE['shopping_cart']);
        
        $this->save_period *= 24*3600;                                
    }
                        
	/*
	*
	* Функция возвращает корзину
	*
	*/
	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;

		// Берем из сессии список variant_id=>amount
		if(!empty($this->shopping_cart))
		{
			$session_items = $this->shopping_cart;
			
			$variants = $this->variants->get_variants(array('id'=>array_keys($session_items)));
			if(!empty($variants))
			{
 
				foreach($variants as $variant)
				{
					$items[$variant->id] = new stdClass();
					$items[$variant->id]->variant = $variant;
					$items[$variant->id]->amount = $session_items[$variant->id];
					$products_ids[] = $variant->product_id;
				}
	
				$products = array();
				foreach($this->products->get_products(array('id'=>$products_ids, 'limit' => count($products_ids))) as $p)
					$products[$p->id]=$p;
				
				$images = $this->products->get_images(array('product_id'=>$products_ids));
				foreach($images as $image)
					$products[$image->product_id]->images[$image->id] = $image;
			
				
				foreach($items as $variant_id=>$item)
				{	
					$purchase = null;
					if(!empty($products[$item->variant->product_id]))
					{
						$purchase = new stdClass();
						$purchase->product = $products[$item->variant->product_id];						
						$purchase->variant = $item->variant;
						$purchase->amount = $item->amount;

						$cart->purchases[] = $purchase;
						$cart->total_price += $item->variant->price*$item->amount;
						$cart->total_products += $item->amount;
					}
				}
				
				// Пользовательская скидка
				$cart->discount = 0;
				if(isset($_SESSION['user_id']) && $user = $this->users->get_user(intval($_SESSION['user_id'])))
					$cart->discount = $user->discount;
					
				$cart->total_price *= (100-$cart->discount)/100;
				
				// Скидка по купону
				if(isset($_SESSION['coupon_code']))
				{
					$cart->coupon = $this->coupons->get_coupon($_SESSION['coupon_code']);
					if($cart->coupon && $cart->coupon->valid && $cart->total_price>=$cart->coupon->min_order_price)
					{
						if($cart->coupon->type=='absolute')
						{
							// Абсолютная скидка не более суммы заказа
							$cart->coupon_discount = $cart->total_price>$cart->coupon->value?$cart->coupon->value:$cart->total_price;
							$cart->total_price = max(0, $cart->total_price-$cart->coupon->value);
						}
						else
						{
							$cart->coupon_discount = $cart->total_price * ($cart->coupon->value)/100;
							$cart->total_price = $cart->total_price-$cart->coupon_discount;
						}
					}
					else
					{
						unset($_SESSION['coupon_code']);
					}
				}
				
			}
		}
			
		return $cart;
	}
	
	/*
	*
	* Добавление варианта товара в корзину
	*
	*/
	public function add_item($variant_id, $amount = 1)
	{ 
		$amount = max(1, $amount);
 
		if(isset($this->shopping_cart[$variant_id]))
      		$amount = max(1, $amount+$this->shopping_cart[$variant_id]);

		// Выберем товар из базы, заодно убедившись в его существовании
		$variant = $this->variants->get_variant($variant_id);

		// Если товар существует, добавим его в корзину
		if(!empty($variant) && ($variant->stock>0) )
		{
			// Не дадим больше чем на складе
			$amount = min($amount, $variant->stock);
	     
			$this->shopping_cart[$variant_id] = intval($amount); 
            setcookie('shopping_cart', serialize($this->shopping_cart), time() + $this->save_period, '/');
        }
	}
	
	/*
	*
	* Обновление количества товара
	*
	*/
	public function update_item($variant_id, $amount = 1)
	{
		$amount = max(1, $amount);
		
		// Выберем товар из базы, заодно убедившись в его существовании
		$variant = $this->variants->get_variant($variant_id);

		// Если товар существует, добавим его в корзину
		if(!empty($variant) && $variant->stock>0)
		{
			// Не дадим больше чем на складе
			$amount = min($amount, $variant->stock);
	     
			$this->shopping_cart[$variant_id] = intval($amount); 
		    setcookie('shopping_cart', serialize($this->shopping_cart), time() + $this->save_period, '/');
        }
 
	}
	
	
	/*
	*
	* Удаление товара из корзины
	*
	*/
	public function delete_item($variant_id)
	{
		unset($this->shopping_cart[$variant_id]); 
        setcookie('shopping_cart', serialize($this->shopping_cart), time() + $this->save_period, '/');
	}
	
	/*
	*
	* Очистка корзины
	*
	*/
	public function empty_cart()
	{
		$this->shopping_cart = array();
        setcookie('shopping_cart', null);
		unset($_SESSION['coupon_code']);
	}
 
	/*
	*
	* Применить купон
	*
	*/
	public function apply_coupon($coupon_code)
	{
		$coupon = $this->coupons->get_coupon((string)$coupon_code);
		if($coupon && $coupon->valid)
		{
			$_SESSION['coupon_code'] = $coupon->code;
		}
		else
		{
			unset($_SESSION['coupon_code']);
		}		
	} 
}

Изменено: Andrey Terkin, 01.04.2016 - 21:27


#12 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 01.04.2016 - 22:22

1. Для хранения корзины используется новый массив $shopping_cart вместо массива $_SESSION['shopping_cart'].
А, собственно, зачем новый массив? Использовали бы старый с тем же успехом. И изменения стали бы проще. Например, изменение 3.1 стало бы ненужным, а в 3.3 было бы достаточно только добавить одну строку

setcookie(...);

 

2. Вместо с корзиной параллельно запоминается значение $_SESSION['coupon_code'].  Если уж переделывать, то и его  надо бы запоминать в куках.

 



#13 baarseek

baarseek
  • Пользователь
  • 41 сообщений

Опубликовано 09.04.2016 - 15:57

Есть одна проблема: после оформления заказа товары по прежнему остаются в корзине ;(



#14 Kors

Kors
  • Фрилансер
  • 3 522 сообщений
  • Программирование
  • Версия CMS:1.x, 2.x
  • Откуда:Россия

Опубликовано 09.04.2016 - 17:48

Есть одна проблема: после оформления заказа товары по прежнему остаются в корзине ;(

 
Причина, видимо, в излишней уверенности автора, заявившего:
 

По сути сессионная корзина, в стандартной симпле, используется только в одном файле - это api/Cart.php.
То есть стоит нам просто изменить логику хранения корзины в этом файле и проблема будет решена.

 

Так вот, корзина может изменяться еще и в view/CartView.php, там надо добавить очистку корзины по новой схеме...



#15 baarseek

baarseek
  • Пользователь
  • 41 сообщений

Опубликовано 09.04.2016 - 18:07

 
Причина, видимо, в излишней уверенности автора, заявившего:
 

 

Так вот, корзина может изменяться еще и в view/CartView.php, там надо добавить очистку корзины по новой схеме...

Спасибо. Подождем автора, может подскажет чего - сам я, очевидно, не разберусь.



#16 Andrey Terkin

Andrey Terkin
  • Фрилансер
  • 77 сообщений
  • Программирование, Верстка

Опубликовано 09.04.2016 - 21:53

В CartView корзина очищается так

 



	    	// Очищаем корзину (сессию)
			$this->cart->empty_cart();

В пункте 3.5 как раз изменялся этот метод



#17 mishanya

mishanya
  • Фрилансер
  • 2 557 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 09.04.2016 - 22:12

 
Причина, видимо, в излишней уверенности автора, заявившего:

Так вот, корзина может изменяться еще и в view/CartView.php, там надо добавить очистку корзины по новой схеме...

 

да ну? там используется метод $this->cart->empty_cart();

 

то что не чистит кукис это уже другое дело


Изменено: mishanya, 09.04.2016 - 22:22


#18 mishanya

mishanya
  • Фрилансер
  • 2 557 сообщений
  • Программирование, Верстка
  • Версия CMS:2.x
  • Откуда:Ukraine

Опубликовано 09.04.2016 - 22:22

Спасибо. Подождем автора, может подскажет чего - сам я, очевидно, не разберусь.

 

попробуйте заменить метод empty_cart в api/Cart.php на

public function empty_cart()
{
	$this->shopping_cart = array();
        setcookie('shopping_cart', null, -1, '/');

	unset($_SESSION['coupon_code']);
}


#19 baarseek

baarseek
  • Пользователь
  • 41 сообщений

Опубликовано 10.04.2016 - 10:39

Спасибо, работает.



#20 DaVinci

DaVinci
  • Фрилансер
  • 1 141 сообщений
  • Программирование, Верстка
  • Версия CMS:1.x, 2.x
  • Откуда:SimplaDev.ru

Опубликовано 10.04.2016 - 14:48

Добрый день, подскажите сколько времени хранятся товары в корзине и как это можно регулировать? Заметил что через день-два пропадают и никак не пойму с чем связанно (симпла вся в доработках, может по дефолту дольше хранятся). Очень важная штука для ремаркетинга, хотелось бы установить время хранения месяц-полтора. Сесии на сервере хранятся, куки вроде пишутся.

 

достаточно открыть index.php и после session_start(); вставить строку

 

setcookie(session_name(),session_id(),time()+30*24*60*60,"/");

 

где 30 количество дней. больше ничего переделывать не надо


Изменено: DaVinci, 10.04.2016 - 16:25





0 пользователей читают эту тему

0 пользователей, 0 гостей, 0 скрытых