artve Опубликовано 23 декабря, 2013 Жалоба Поделиться Опубликовано 23 декабря, 2013 Добрый день, подскажите сколько времени хранятся товары в корзине и как это можно регулировать? Заметил что через день-два пропадают и никак не пойму с чем связанно (симпла вся в доработках, может по дефолту дольше хранятся). Очень важная штука для ремаркетинга, хотелось бы установить время хранения месяц-полтора. Сесии на сервере хранятся, куки вроде пишутся. Цитата Ссылка на сообщение Поделиться на другие сайты
tsybart Опубликовано 31 марта, 2016 Жалоба Поделиться Опубликовано 31 марта, 2016 ап Кто-то знает как решить вопрос? Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 31 марта, 2016 Жалоба Поделиться Опубликовано 31 марта, 2016 ап Кто-то знает как решить вопрос?Товары в корзине хранятся в сессии. У меня есть доработка которая хранит все товары в куки скажем на год. Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 31 марта, 2016 Жалоба Поделиться Опубликовано 31 марта, 2016 http://simpla-tuning.com/zapominanie-korziny-polzovatelya Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 31 марта, 2016 Жалоба Поделиться Опубликовано 31 марта, 2016 ап Кто-то знает как решить вопрос? писать свое решение или заказать у кого-то), вчера сделал для клиента сохранение в базе корзины для пользователя и в кукис на год для гостей. если интересно пишите в личку Цитата Ссылка на сообщение Поделиться на другие сайты
KostyanBr Опубликовано 31 марта, 2016 Жалоба Поделиться Опубликовано 31 марта, 2016 писать свое решение или заказать у кого-то), вчера сделал для клиента сохранение в базе корзины для пользователя и в кукис на год для гостей. если интересно пишите в личкуИнтересно. Писал в скайп - в ответ тишина. Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 31 марта, 2016 Жалоба Поделиться Опубликовано 31 марта, 2016 Интересно. Писал в скайп - в ответ тишина.Я с телефона сейчас тут 3г не очень что-то со скайпом дружит Цитата Ссылка на сообщение Поделиться на другие сайты
Andrey Terkin Опубликовано 1 апреля, 2016 Жалоба Поделиться Опубликовано 1 апреля, 2016 (изменено) По сути сессионная корзина, в стандартной симпле, используется только в одном файле - это 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; ............................................ Изменено 1 апреля, 2016 пользователем Andrey Terkin Цитата Ссылка на сообщение Поделиться на другие сайты
Andrey Terkin Опубликовано 1 апреля, 2016 Жалоба Поделиться Опубликовано 1 апреля, 2016 (изменено) 2. Добавим конструктор в наш класс в котором мы получим содержимое нашей корзины из кук, а также сразу пересчитаем наш период из дней в секунды public function __construct() { parent::__construct(); $this->shopping_cart = empty($_COOKIE['shopping_cart']) ? array() : unserialize($_COOKIE['shopping_cart']); $this->save_period *= 24*3600; } Изменено 1 апреля, 2016 пользователем Andrey Terkin Цитата Ссылка на сообщение Поделиться на другие сайты
Andrey Terkin Опубликовано 1 апреля, 2016 Жалоба Поделиться Опубликовано 1 апреля, 2016 (изменено) 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); Изменено 1 апреля, 2016 пользователем Andrey Terkin Цитата Ссылка на сообщение Поделиться на другие сайты
Andrey Terkin Опубликовано 1 апреля, 2016 Жалоба Поделиться Опубликовано 1 апреля, 2016 (изменено) Файл выложить у меня не вышло, поэтому помещаю код файла 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']); } } } Изменено 1 апреля, 2016 пользователем Andrey Terkin Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 1 апреля, 2016 Жалоба Поделиться Опубликовано 1 апреля, 2016 1. Для хранения корзины используется новый массив $shopping_cart вместо массива $_SESSION['shopping_cart'].А, собственно, зачем новый массив? Использовали бы старый с тем же успехом. И изменения стали бы проще. Например, изменение 3.1 стало бы ненужным, а в 3.3 было бы достаточно только добавить одну строкуsetcookie(...); 2. Вместо с корзиной параллельно запоминается значение $_SESSION['coupon_code']. Если уж переделывать, то и его надо бы запоминать в куках. Цитата Ссылка на сообщение Поделиться на другие сайты
baarseek Опубликовано 9 апреля, 2016 Жалоба Поделиться Опубликовано 9 апреля, 2016 Есть одна проблема: после оформления заказа товары по прежнему остаются в корзине ;( Цитата Ссылка на сообщение Поделиться на другие сайты
Kors Опубликовано 9 апреля, 2016 Жалоба Поделиться Опубликовано 9 апреля, 2016 Есть одна проблема: после оформления заказа товары по прежнему остаются в корзине ;( Причина, видимо, в излишней уверенности автора, заявившего: По сути сессионная корзина, в стандартной симпле, используется только в одном файле - это api/Cart.php.То есть стоит нам просто изменить логику хранения корзины в этом файле и проблема будет решена. Так вот, корзина может изменяться еще и в view/CartView.php, там надо добавить очистку корзины по новой схеме... Цитата Ссылка на сообщение Поделиться на другие сайты
baarseek Опубликовано 9 апреля, 2016 Жалоба Поделиться Опубликовано 9 апреля, 2016 Причина, видимо, в излишней уверенности автора, заявившего: Так вот, корзина может изменяться еще и в view/CartView.php, там надо добавить очистку корзины по новой схеме...Спасибо. Подождем автора, может подскажет чего - сам я, очевидно, не разберусь. Цитата Ссылка на сообщение Поделиться на другие сайты
Andrey Terkin Опубликовано 9 апреля, 2016 Жалоба Поделиться Опубликовано 9 апреля, 2016 В CartView корзина очищается так // Очищаем корзину (сессию) $this->cart->empty_cart(); В пункте 3.5 как раз изменялся этот метод Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 9 апреля, 2016 Жалоба Поделиться Опубликовано 9 апреля, 2016 (изменено) Причина, видимо, в излишней уверенности автора, заявившего:Так вот, корзина может изменяться еще и в view/CartView.php, там надо добавить очистку корзины по новой схеме... да ну? там используется метод $this->cart->empty_cart(); то что не чистит кукис это уже другое дело Изменено 9 апреля, 2016 пользователем mishanya Цитата Ссылка на сообщение Поделиться на другие сайты
mishanya Опубликовано 9 апреля, 2016 Жалоба Поделиться Опубликовано 9 апреля, 2016 Спасибо. Подождем автора, может подскажет чего - сам я, очевидно, не разберусь. попробуйте заменить метод empty_cart в api/Cart.php на public function empty_cart() { $this->shopping_cart = array(); setcookie('shopping_cart', null, -1, '/'); unset($_SESSION['coupon_code']); } Цитата Ссылка на сообщение Поделиться на другие сайты
baarseek Опубликовано 10 апреля, 2016 Жалоба Поделиться Опубликовано 10 апреля, 2016 Спасибо, работает. Цитата Ссылка на сообщение Поделиться на другие сайты
DaVinci Опубликовано 10 апреля, 2016 Жалоба Поделиться Опубликовано 10 апреля, 2016 (изменено) Добрый день, подскажите сколько времени хранятся товары в корзине и как это можно регулировать? Заметил что через день-два пропадают и никак не пойму с чем связанно (симпла вся в доработках, может по дефолту дольше хранятся). Очень важная штука для ремаркетинга, хотелось бы установить время хранения месяц-полтора. Сесии на сервере хранятся, куки вроде пишутся. достаточно открыть index.php и после session_start(); вставить строку setcookie(session_name(),session_id(),time()+30*24*60*60,"/"); где 30 количество дней. больше ничего переделывать не надо Изменено 10 апреля, 2016 пользователем DaVinci Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 10 апреля, 2016 Жалоба Поделиться Опубликовано 10 апреля, 2016 Почему Вы все используете такой формат: setcookie(session_name(),session_id(),time()+30*24*60*60,"/"); если куда проще сделать так: setcookie(session_name(),session_id(),strtotime('+1 year'),"/"); Тут печенька хранится 1 год. Цитата Ссылка на сообщение Поделиться на другие сайты
Sitelogic Опубликовано 24 января, 2019 Жалоба Поделиться Опубликовано 24 января, 2019 Почему Вы все используете такой формат: setcookie(session_name(),session_id(),time()+30*24*60*60,"/"); если куда проще сделать так: setcookie(session_name(),session_id(),strtotime('+1 year'),"/"); Тут печенька хранится 1 год.+1 year - не работает печенька, щас пробую мат модель ) Цитата Ссылка на сообщение Поделиться на другие сайты
Noxter Опубликовано 24 января, 2019 Жалоба Поделиться Опубликовано 24 января, 2019 +1 year - не работает печенька, щас пробую мат модель )Всё прекрасно работает. Если не работает у вас, значит дело в руках. Цитата Ссылка на сообщение Поделиться на другие сайты
Sitelogic Опубликовано 28 января, 2019 Жалоба Поделиться Опубликовано 28 января, 2019 (изменено) Всё прекрасно работает.Если не работает у вас, значит дело в руках.Нет, и с мат модель тоже не работает. Странно, но строку в код добавить руки у меня способны )) Вот скрин этого куска кода, что не так? Изменено 28 января, 2019 пользователем Sitelogic Цитата Ссылка на сообщение Поделиться на другие сайты
Sitelogic Опубликовано 4 февраля, 2019 Жалоба Поделиться Опубликовано 4 февраля, 2019 Всё прекрасно работает.Если не работает у вас, значит дело в руках.Где Ваши "прямые" руки, что молчим ? Цитата Ссылка на сообщение Поделиться на другие сайты
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.