Jump to content

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


Recommended Posts

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

Link to post
Share on other sites
  • 2 years later...

ап

 

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

 

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

Link to post
Share on other sites

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

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

Link to post
Share on other sites

По сути сессионная корзина, в стандартной симпле, используется только в одном файле - это 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;              
    
    ............................................
Edited by Andrey Terkin
Link to post
Share on other sites

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

 

public function __construct()
    {
    	parent::__construct();
        
        $this->shopping_cart = empty($_COOKIE['shopping_cart']) ? array() : unserialize($_COOKIE['shopping_cart']);
        
        $this->save_period *= 24*3600;                                
    }
Edited by Andrey Terkin
Link to post
Share on other sites

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);
Edited by Andrey Terkin
Link to post
Share on other sites

Файл выложить у меня не вышло, поэтому  помещаю код файла 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']);
		}		
	} 
}
Edited by Andrey Terkin
Link to post
Share on other sites

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

setcookie(...);

 

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

 

Link to post
Share on other sites

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

 

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

 

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

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

 

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

Link to post
Share on other sites

 

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

 

 

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

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

Link to post
Share on other sites

 

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

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

 

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

 

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

Edited by mishanya
Link to post
Share on other sites

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

 

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

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

	unset($_SESSION['coupon_code']);
}
Link to post
Share on other sites

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

 

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

 

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

 

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

Edited by DaVinci
Link to post
Share on other sites

Почему Вы все используете такой формат:


setcookie(session_name(),session_id(),time()+30*24*60*60,"/");
если куда проще сделать так:

setcookie(session_name(),session_id(),strtotime('+1 year'),"/");
Тут печенька хранится 1 год.
Link to post
Share on other sites
  • 2 years later...

 

Почему Вы все используете такой формат:

setcookie(session_name(),session_id(),time()+30*24*60*60,"/");
если куда проще сделать так:
setcookie(session_name(),session_id(),strtotime('+1 year'),"/");
Тут печенька хранится 1 год.

+1 year - не работает печенька, щас пробую мат модель )

Link to post
Share on other sites

Всё прекрасно работает.

Если не работает у вас, значит дело в руках.

Нет, и с мат модель тоже не работает. Странно, но строку в код добавить руки у меня способны )) Вот скрин этого куска кода, что не так?

post-24046-0-59216200-1548704870_thumb.png

Edited by Sitelogic
Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...