Перейти к содержанию
Официальный форум поддержки Simpla

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


Рекомендуемые сообщения

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

Ссылка на сообщение
Поделиться на другие сайты
  • 2 года спустя...

ап

 

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

Товары в корзине хранятся в сессии.

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

Ссылка на сообщение
Поделиться на другие сайты

ап

 

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

Ссылка на сообщение
Поделиться на другие сайты

По сути сессионная корзина, в стандартной симпле, используется только в одном файле - это 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
Ссылка на сообщение
Поделиться на другие сайты

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
Ссылка на сообщение
Поделиться на другие сайты

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
Ссылка на сообщение
Поделиться на другие сайты

Файл выложить у меня не вышло, поэтому  помещаю код файла 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
Ссылка на сообщение
Поделиться на другие сайты

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

setcookie(...);

 

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

 

Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

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

 

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

Ссылка на сообщение
Поделиться на другие сайты

 

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

 

 

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

 



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

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

Ссылка на сообщение
Поделиться на другие сайты

 

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

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

 

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

 

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

Изменено пользователем mishanya
Ссылка на сообщение
Поделиться на другие сайты

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

 

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

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

	unset($_SESSION['coupon_code']);
}
Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

Изменено пользователем DaVinci
Ссылка на сообщение
Поделиться на другие сайты

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


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

setcookie(session_name(),session_id(),strtotime('+1 year'),"/");
Тут печенька хранится 1 год.
Ссылка на сообщение
Поделиться на другие сайты
  • 2 года спустя...

 

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

Изменено пользователем Sitelogic
Ссылка на сообщение
Поделиться на другие сайты

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

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

Где Ваши "прямые" руки, что молчим ?

Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
×
×
  • Создать...