artve Posted December 23, 2013 Report Share Posted December 23, 2013 Добрый день, подскажите сколько времени хранятся товары в корзине и как это можно регулировать? Заметил что через день-два пропадают и никак не пойму с чем связанно (симпла вся в доработках, может по дефолту дольше хранятся). Очень важная штука для ремаркетинга, хотелось бы установить время хранения месяц-полтора. Сесии на сервере хранятся, куки вроде пишутся. Quote Link to post Share on other sites
tsybart Posted March 31, 2016 Report Share Posted March 31, 2016 ап Кто-то знает как решить вопрос? Quote Link to post Share on other sites
Noxter Posted March 31, 2016 Report Share Posted March 31, 2016 ап Кто-то знает как решить вопрос?Товары в корзине хранятся в сессии. У меня есть доработка которая хранит все товары в куки скажем на год. Quote Link to post Share on other sites
Kors Posted March 31, 2016 Report Share Posted March 31, 2016 http://simpla-tuning.com/zapominanie-korziny-polzovatelya Quote Link to post Share on other sites
mishanya Posted March 31, 2016 Report Share Posted March 31, 2016 ап Кто-то знает как решить вопрос? писать свое решение или заказать у кого-то), вчера сделал для клиента сохранение в базе корзины для пользователя и в кукис на год для гостей. если интересно пишите в личку Quote Link to post Share on other sites
KostyanBr Posted March 31, 2016 Report Share Posted March 31, 2016 писать свое решение или заказать у кого-то), вчера сделал для клиента сохранение в базе корзины для пользователя и в кукис на год для гостей. если интересно пишите в личкуИнтересно. Писал в скайп - в ответ тишина. Quote Link to post Share on other sites
mishanya Posted March 31, 2016 Report Share Posted March 31, 2016 Интересно. Писал в скайп - в ответ тишина.Я с телефона сейчас тут 3г не очень что-то со скайпом дружит Quote Link to post Share on other sites
Andrey Terkin Posted April 1, 2016 Report Share Posted April 1, 2016 (edited) По сути сессионная корзина, в стандартной симпле, используется только в одном файле - это 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 April 1, 2016 by Andrey Terkin Quote Link to post Share on other sites
Andrey Terkin Posted April 1, 2016 Report Share Posted April 1, 2016 (edited) 2. Добавим конструктор в наш класс в котором мы получим содержимое нашей корзины из кук, а также сразу пересчитаем наш период из дней в секунды public function __construct() { parent::__construct(); $this->shopping_cart = empty($_COOKIE['shopping_cart']) ? array() : unserialize($_COOKIE['shopping_cart']); $this->save_period *= 24*3600; } Edited April 1, 2016 by Andrey Terkin Quote Link to post Share on other sites
Andrey Terkin Posted April 1, 2016 Report Share Posted April 1, 2016 (edited) 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 April 1, 2016 by Andrey Terkin Quote Link to post Share on other sites
Andrey Terkin Posted April 1, 2016 Report Share Posted April 1, 2016 (edited) Файл выложить у меня не вышло, поэтому помещаю код файла 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 April 1, 2016 by Andrey Terkin Quote Link to post Share on other sites
Kors Posted April 1, 2016 Report Share Posted April 1, 2016 1. Для хранения корзины используется новый массив $shopping_cart вместо массива $_SESSION['shopping_cart'].А, собственно, зачем новый массив? Использовали бы старый с тем же успехом. И изменения стали бы проще. Например, изменение 3.1 стало бы ненужным, а в 3.3 было бы достаточно только добавить одну строкуsetcookie(...); 2. Вместо с корзиной параллельно запоминается значение $_SESSION['coupon_code']. Если уж переделывать, то и его надо бы запоминать в куках. Quote Link to post Share on other sites
baarseek Posted April 9, 2016 Report Share Posted April 9, 2016 Есть одна проблема: после оформления заказа товары по прежнему остаются в корзине ;( Quote Link to post Share on other sites
Kors Posted April 9, 2016 Report Share Posted April 9, 2016 Есть одна проблема: после оформления заказа товары по прежнему остаются в корзине ;( Причина, видимо, в излишней уверенности автора, заявившего: По сути сессионная корзина, в стандартной симпле, используется только в одном файле - это api/Cart.php.То есть стоит нам просто изменить логику хранения корзины в этом файле и проблема будет решена. Так вот, корзина может изменяться еще и в view/CartView.php, там надо добавить очистку корзины по новой схеме... Quote Link to post Share on other sites
baarseek Posted April 9, 2016 Report Share Posted April 9, 2016 Причина, видимо, в излишней уверенности автора, заявившего: Так вот, корзина может изменяться еще и в view/CartView.php, там надо добавить очистку корзины по новой схеме...Спасибо. Подождем автора, может подскажет чего - сам я, очевидно, не разберусь. Quote Link to post Share on other sites
Andrey Terkin Posted April 9, 2016 Report Share Posted April 9, 2016 В CartView корзина очищается так // Очищаем корзину (сессию) $this->cart->empty_cart(); В пункте 3.5 как раз изменялся этот метод Quote Link to post Share on other sites
mishanya Posted April 9, 2016 Report Share Posted April 9, 2016 (edited) Причина, видимо, в излишней уверенности автора, заявившего:Так вот, корзина может изменяться еще и в view/CartView.php, там надо добавить очистку корзины по новой схеме... да ну? там используется метод $this->cart->empty_cart(); то что не чистит кукис это уже другое дело Edited April 9, 2016 by mishanya Quote Link to post Share on other sites
mishanya Posted April 9, 2016 Report Share Posted April 9, 2016 Спасибо. Подождем автора, может подскажет чего - сам я, очевидно, не разберусь. попробуйте заменить метод empty_cart в api/Cart.php на public function empty_cart() { $this->shopping_cart = array(); setcookie('shopping_cart', null, -1, '/'); unset($_SESSION['coupon_code']); } Quote Link to post Share on other sites
baarseek Posted April 10, 2016 Report Share Posted April 10, 2016 Спасибо, работает. Quote Link to post Share on other sites
DaVinci Posted April 10, 2016 Report Share Posted April 10, 2016 (edited) Добрый день, подскажите сколько времени хранятся товары в корзине и как это можно регулировать? Заметил что через день-два пропадают и никак не пойму с чем связанно (симпла вся в доработках, может по дефолту дольше хранятся). Очень важная штука для ремаркетинга, хотелось бы установить время хранения месяц-полтора. Сесии на сервере хранятся, куки вроде пишутся. достаточно открыть index.php и после session_start(); вставить строку setcookie(session_name(),session_id(),time()+30*24*60*60,"/"); где 30 количество дней. больше ничего переделывать не надо Edited April 10, 2016 by DaVinci Quote Link to post Share on other sites
Noxter Posted April 10, 2016 Report Share Posted April 10, 2016 Почему Вы все используете такой формат: setcookie(session_name(),session_id(),time()+30*24*60*60,"/"); если куда проще сделать так: setcookie(session_name(),session_id(),strtotime('+1 year'),"/"); Тут печенька хранится 1 год. Quote Link to post Share on other sites
Sitelogic Posted January 24, 2019 Report Share Posted January 24, 2019 Почему Вы все используете такой формат: setcookie(session_name(),session_id(),time()+30*24*60*60,"/"); если куда проще сделать так: setcookie(session_name(),session_id(),strtotime('+1 year'),"/"); Тут печенька хранится 1 год.+1 year - не работает печенька, щас пробую мат модель ) Quote Link to post Share on other sites
Noxter Posted January 24, 2019 Report Share Posted January 24, 2019 +1 year - не работает печенька, щас пробую мат модель )Всё прекрасно работает. Если не работает у вас, значит дело в руках. Quote Link to post Share on other sites
Sitelogic Posted January 28, 2019 Report Share Posted January 28, 2019 (edited) Всё прекрасно работает.Если не работает у вас, значит дело в руках.Нет, и с мат модель тоже не работает. Странно, но строку в код добавить руки у меня способны )) Вот скрин этого куска кода, что не так? Edited January 28, 2019 by Sitelogic Quote Link to post Share on other sites
Sitelogic Posted February 4, 2019 Report Share Posted February 4, 2019 Всё прекрасно работает.Если не работает у вас, значит дело в руках.Где Ваши "прямые" руки, что молчим ? Quote Link to post Share on other sites
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.