<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Форум ReadyScript &mdash; Логика работы корзины]]></title>
		<link>https://forum.readyscript.ru/topic/705/logika-raboty-korziny/</link>
		<atom:link href="https://forum.readyscript.ru/feed/rss/topic/705" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Логика работы корзины».]]></description>
		<lastBuildDate>Fri, 27 May 2016 07:45:24 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Логика работы корзины]]></title>
			<link>https://forum.readyscript.ru/post/3314/#p3314</link>
			<description><![CDATA[<p>Всё будет, не переживайте.</p>]]></description>
			<author><![CDATA[null@example.com (Закусило Александр)]]></author>
			<pubDate>Fri, 27 May 2016 07:45:24 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/3314/#p3314</guid>
		</item>
		<item>
			<title><![CDATA[Re: Логика работы корзины]]></title>
			<link>https://forum.readyscript.ru/post/3307/#p3307</link>
			<description><![CDATA[<p>А я Ярослава поддержу, меня как опт покупателя раздражало у некоторых поставщиков, что корзина с другого устройства недоступна! Лучше делать привязку по session_id, если юзер не авторизован, а если авторизован, то по user_id<br />Это и рознице не помешает и опту плюс.</p>]]></description>
			<author><![CDATA[null@example.com (Максим)]]></author>
			<pubDate>Thu, 26 May 2016 20:48:49 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/3307/#p3307</guid>
		</item>
		<item>
			<title><![CDATA[Re: Логика работы корзины]]></title>
			<link>https://forum.readyscript.ru/post/3191/#p3191</link>
			<description><![CDATA[<p>Отлично! Избранного не хватает.</p>]]></description>
			<author><![CDATA[null@example.com (Ярослав)]]></author>
			<pubDate>Fri, 13 May 2016 12:10:17 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/3191/#p3191</guid>
		</item>
		<item>
			<title><![CDATA[Re: Логика работы корзины]]></title>
			<link>https://forum.readyscript.ru/post/3189/#p3189</link>
			<description><![CDATA[<div class="quotebox"><cite>admin пишет:</cite><blockquote><p>Я понял вашу точку зрения.</p><p>Полностью кросс-устройственной у нас будет функция Избранное (в будущих версиях), именно эта функция позволит добавив товар на одном устройстве видеть его на всех других устройствах абсолютно всегда. А уже с избранного всегда можно будет перенести товар в локальную корзину.</p></blockquote></div><p>Вот это нам было тоже очень полезно и удобно</p>]]></description>
			<author><![CDATA[null@example.com (Андрей)]]></author>
			<pubDate>Fri, 13 May 2016 08:14:30 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/3189/#p3189</guid>
		</item>
		<item>
			<title><![CDATA[Re: Логика работы корзины]]></title>
			<link>https://forum.readyscript.ru/post/3187/#p3187</link>
			<description><![CDATA[<p>Я понял вашу точку зрения.</p><p>Полностью кросс-устройственной у нас будет функция Избранное (в будущих версиях), именно эта функция позволит добавив товар на одном устройстве видеть его на всех других устройствах абсолютно всегда. А уже с избранного всегда можно будет перенести товар в локальную корзину.</p>]]></description>
			<author><![CDATA[null@example.com (admin)]]></author>
			<pubDate>Fri, 13 May 2016 07:26:43 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/3187/#p3187</guid>
		</item>
		<item>
			<title><![CDATA[Re: Логика работы корзины]]></title>
			<link>https://forum.readyscript.ru/post/3186/#p3186</link>
			<description><![CDATA[<p>Я и моя семья сейчас практически большинство покупок (кроме еды, наверное) делают через интернет. Дешевле, больше выбор. И достаточно часто пользуешься разными устройствами.<br />У 003, oзон, ситилинк, ибей, элиэкспресс, Днс, Вайлдберрис всегда корзина доступна везде (специально проверил).&nbsp; Они стараются, чтобы товар, заинтересовавший пользователя, был постоянно на виду.</p><p>Изменил, как описал выше. Наблюдаю.</p>]]></description>
			<author><![CDATA[null@example.com (Ярослав)]]></author>
			<pubDate>Fri, 13 May 2016 06:52:17 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/3186/#p3186</guid>
		</item>
		<item>
			<title><![CDATA[Re: Логика работы корзины]]></title>
			<link>https://forum.readyscript.ru/post/3185/#p3185</link>
			<description><![CDATA[<p>Признаюсь, у меня на этот счет другое мнение, меня наоборот ставит в ступор, если я собрал корзину, авторизовался и в моей корзине вдруг появляются неожиданно &quot;левые&quot; товары (которые я когда-то добавлял с какого-то устройства где-то). Я же собрал абсолютно новую корзину сейчас! </p><p>+ Сложно представить ситуацию, когда нужно, чтобы одна корзина собиралась на разных устройствах или в очень растянутые сроки. (хотя даже это у нас возможно, если начинать работу на новом устройстве с авторизации)</p><p>Безусловно, вы можете в своем проекте поправить логику, как это вам нужно. <br />Выборка элементов корзины по session_id - есть только в классе \Shop\Model\Orm\Cart<br />Логика действий при авторизации есть только в \Shop\Config\Handlers::authUser</p>]]></description>
			<author><![CDATA[null@example.com (admin)]]></author>
			<pubDate>Thu, 12 May 2016 18:59:28 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/3185/#p3185</guid>
		</item>
		<item>
			<title><![CDATA[Re: Логика работы корзины]]></title>
			<link>https://forum.readyscript.ru/post/3183/#p3183</link>
			<description><![CDATA[<p>Убрал удаление элементов корзины в handlers.inc.<br />Доработал модель корзины. Работал топором, буду тестировать:<br /></p><div class="codebox"><pre><code> /**
    * Получать экземпляр класса можно только через ::currentBasket()
    */
    protected function __construct($mode = self::MODE_SESSION, Orm\Order $order = null)
    {
        $this-&gt;session_id = session_id();
        $this-&gt;mode = $mode;
        $this-&gt;order = $order;
        switch($this-&gt;mode) {
            case self::MODE_ORDER: {
                $this-&gt;cartitem = new Orm\OrderItem();
                //2016_05 для привязки корзины к пользователю
                $this-&gt;select_expression =array(&#039;order_id=&quot;#order_id1&quot;&#039;,array(
                    &#039;order_id1&#039; =&gt; $this-&gt;order[&#039;id&#039;]
                ));
                $this-&gt;order_expression = &#039;sortn&#039;;
                break;
            }
            case self::MODE_EMPTY: {
                $this-&gt;cartitem = new Orm\CartItem();
            }
            default: {
                $this-&gt;cartitem = new Orm\CartItem();
                 //2016_05 ТУТ
                $this-&gt;select_expression = array(&#039;site_id=&quot;#site_id1&quot; and (session_id=&quot;#session_id1&quot; or (user_id=&quot;#user_id1&quot; and user_id&gt;0))&#039;,array(
                    &#039;site_id1&#039; =&gt; \RS\Site\Manager::getSiteId(),
                    &#039;session_id1&#039; =&gt; $this-&gt;session_id ,
                    &#039;user_id1&#039; =&gt; \RS\Application\Auth::getCurrentUser()-&gt;id
                 )   
                );                
                $this-&gt;order_expression = &#039;dateof&#039;;
            }
        }
        
        $this-&gt;loadCart();
    }

/**
    * Загружает корзину из базы данных
    * 
    * @return void
    */
    function loadCart()
    {
        $q = \RS\Orm\Request::make()
            -&gt;from($this-&gt;cartitem)
            -&gt;where($this-&gt;select_expression[0],$this-&gt;select_expression[1])//ТУТ
            
       $this-&gt;items = $q-&gt;objects(null, &#039;uniq&#039;);
       if ($this-&gt;mode == self::MODE_ORDER) {
           $this-&gt;order_items = $this-&gt;items;
       }
    }
 /**
    * Удаляет позицию из корзины.
    * 
    * @param string $uniq - Уникальный идентификатор элемента корзины
    * @return bool
    */
    function removeItem($uniq)
    {
        if (isset($this-&gt;items[$uniq])) {
            if ($this-&gt;mode == self::MODE_SESSION) {
                \RS\Orm\Request::make()
                    -&gt;delete()
                    -&gt;from($this-&gt;cartitem)
                   -&gt;where($this-&gt;select_expression[0],$this-&gt;select_expression[1]) //ТУТ
                    -&gt;where(array(
                        &#039;uniq&#039; =&gt; $uniq
                    ))-&gt;exec();
            }
            
            unset($this-&gt;items[$uniq]);
            unset($this-&gt;order_items[$uniq]);
            unset($this-&gt;cache_products[$uniq]);
            unset($this-&gt;cache_coupons[$uniq]);
        }
        return true;
    }

 /**
    * Очищает корзину
    */
    function clean()
    {
        $this-&gt;items = array();
        $this-&gt;order_items = array();
        $cache_coupons = null;
        $cache_products = null;
        
        $result = \RS\Orm\Request::make()
            -&gt;delete()
            -&gt;from($this-&gt;cartitem)
            -&gt;where(
                 //2016_05_12 eventus поддержка привязки к пользователям
                  &#039;site_id=&quot;#site_id1&quot; and (session_id=&quot;#session_id1&quot; or (user_id=&quot;#user_id1&quot; and user_id&gt;0))&#039;,array(
                    &#039;site_id1&#039; =&gt; \RS\Site\Manager::getSiteId(),
                    &#039;session_id1&#039; =&gt; $this-&gt;session_id ,
                    &#039;user_id1&#039; =&gt; \RS\Application\Auth::getCurrentUser()-&gt;id
                 ))-&gt;exec();
        
        $this-&gt;cleanInfoCache();
        return true;
    }
   /**
    * Возвращает информацию по количеству товаров и стоимости товаров в корзине
    * 
    * @param mixed $format - форматировать общую сумму заказа
    * @param mixed $in_base_currency - возвращать в базовой валюте
    * @return array
    */
    public static function getCurrentInfo($format = true, $use_currency = true)
    {
           self::currentCart()-&gt;cleanInfoCache();     //ТУТ добавил для принудительного обновления инф-ции о корзине 
        $options = (int)$format.(int)$use_currency.\Catalog\Model\CurrencyApi::getCurrentCurrency()-&gt;id;
        
        if (!isset($_SESSION[self::CART_SESSION_VAR][$options])) {
            self::currentCart()-&gt;getCartData($format, $use_currency);
        }
        
        return $_SESSION[self::CART_SESSION_VAR][$options];
    }
      </code></pre></div><p>Итого:<br />1. если были товары в корзине при авторизации, то они попадут к в корзину авторизованному.<br />2. Любые изменения в корзине на разных устройствах под одним и тем же пользователем синхронизированы</p>]]></description>
			<author><![CDATA[null@example.com (Ярослав)]]></author>
			<pubDate>Thu, 12 May 2016 15:29:31 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/3183/#p3183</guid>
		</item>
		<item>
			<title><![CDATA[Re: Логика работы корзины]]></title>
			<link>https://forum.readyscript.ru/post/3178/#p3178</link>
			<description><![CDATA[<p>Как раз я привел примеры работы крупных розничных магазинов, где сам покупаю товары и моя корзина доступна мне на любом устройстве (домашний, офисный, планшет).<br />В нашем случае надо следить, чтобы при авторизации корзина была пустой или затрется предыдущая. Т.е. каждый раз очищать предварительно корзину. Ничто так не раздражает, как потерянный заказ.</p><p>Подавляющее число оптовиков - ИПшники без работников. И они в связи своей мобильностью как раз и чаще всего попадают с удаленным заказом.</p><p>Достаточно ли правки модели корзины,чтоб для авторизованных пользователей не использовать session_id? Или где то еще используется привязка?</p>]]></description>
			<author><![CDATA[null@example.com (Ярослав)]]></author>
			<pubDate>Thu, 12 May 2016 12:27:18 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/3178/#p3178</guid>
		</item>
		<item>
			<title><![CDATA[Re: Логика работы корзины]]></title>
			<link>https://forum.readyscript.ru/post/3170/#p3170</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>Под одним и тем же логином заходят разные менеджеры и перехватывают друг у друга корзины.</p></blockquote></div><p>Конечно, у каждого менеджера обязательно должен быть свой логин. У нас же базовое назначение движка - это розница, поэтому поддерживается принцип - пользователь оформляет заказ с одного компьютера в один момент времени и в большинстве случаев за одну сессию.</p><p>Так как привязка товаров идет к session_id, то безусловно в вашем случае товары будут привязываться либо к одному пользователю, либо к другому, если они оба сидят за разными компьютерами под одной учетной записью. (так как у менеджеров будет разный session_id и общий user_id)</p>]]></description>
			<author><![CDATA[null@example.com (admin)]]></author>
			<pubDate>Wed, 11 May 2016 22:26:20 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/3170/#p3170</guid>
		</item>
		<item>
			<title><![CDATA[Re: Логика работы корзины]]></title>
			<link>https://forum.readyscript.ru/post/3169/#p3169</link>
			<description><![CDATA[<p>Возможно я разобрался с пропадающими корзинами. Все дело в привязке элементов корзины к сессии у авторизованных пользователей.<br />1. В одном браузере авторизованный пользователь набрал корзину.<br />2. Зашел в другом браузере (например, дома). Элементы корзины перепривязываются при авторизации ко второй сессии, но в другом то браузере пользователь не выходил! В результате в первой сессии пользователь теряет корзину.&nbsp; </p><p>Просто уже достаточно много жалоб на пропадающие корзины у оптовиков.&nbsp; Под одним и тем же логином заходят разные менеджеры и перехватывают друг у друга корзины.</p><br /><p>Только что провел эксперимент:<br />1. Набрал в разных сессиях авторизованным пользователем корзины.<br />2. В сессии 1 вышел. (при этом корзина сохраняется и видна)<br />3. Сразу же авторизовался в сессии 1<br />4. В сессии 2 корзина сразу опустела.</p><br /><p>Проверил у крупных магазинов логику:<br />1. Добавленный товар с разных авторизованных сессий&nbsp; виден в корзине у обоих. Корзина общая, привязана к авторизованному пользователю или к сессии у гостя.<br />2. Если авторизоваться с заполненными корзинами, то содержимое корзин объединяется, а не заменяется новой как у нас.</p>]]></description>
			<author><![CDATA[null@example.com (Ярослав)]]></author>
			<pubDate>Wed, 11 May 2016 18:13:55 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/3169/#p3169</guid>
		</item>
		<item>
			<title><![CDATA[Re: Логика работы корзины]]></title>
			<link>https://forum.readyscript.ru/post/3163/#p3163</link>
			<description><![CDATA[<p>Спасибо за пояснение!</p>]]></description>
			<author><![CDATA[null@example.com (Ярослав)]]></author>
			<pubDate>Tue, 10 May 2016 16:41:58 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/3163/#p3163</guid>
		</item>
		<item>
			<title><![CDATA[Re: Логика работы корзины]]></title>
			<link>https://forum.readyscript.ru/post/3153/#p3153</link>
			<description><![CDATA[<div class="quotebox"><blockquote><p>- Товары, которые были привязаны&nbsp; user_id до этого удаляются (т.к. пользователь собрал новую корзину)</p></blockquote></div><p>Здесь описывается следующая ситуация:</p><p>- Допустим пользователь будучи авторизованным на одном компьютере (А) добавил в корзину несколько товаров и закрыл браузер. (товары привязались к его session_id и user_id)</p><p>- Затем он перешел на другой компьютер (Б) и будучи неавторизованным собрал новую корзину.</p><p>Встает вопрос: &quot;Что делать, если пользователь авторизуется на компьютере Б с собранной новой корзиной?&quot;</p><p>Единственно верный в данном случае вариант, удалить из базы товары, собранные на компьютере А и привязать новые товары к user_id, собранные на компьютере Б.</p>]]></description>
			<author><![CDATA[null@example.com (admin)]]></author>
			<pubDate>Mon, 09 May 2016 10:28:18 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/3153/#p3153</guid>
		</item>
		<item>
			<title><![CDATA[Re: Логика работы корзины]]></title>
			<link>https://forum.readyscript.ru/post/3151/#p3151</link>
			<description><![CDATA[<p>Спасибо за ответ!<br /></p><div class="quotebox"><cite>admin пишет:</cite><blockquote><p><strong>Когда пользователь авторизовывается и у него есть товары в корзине:</strong><br />- Товары, которые были привязаны&nbsp; user_id до этого удаляются (т.к. пользователь собрал новую корзину)</p></blockquote></div><p>Здесь не совсем понял про удаление.</p>]]></description>
			<author><![CDATA[null@example.com (Ярослав)]]></author>
			<pubDate>Fri, 06 May 2016 18:33:39 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/3151/#p3151</guid>
		</item>
		<item>
			<title><![CDATA[Re: Логика работы корзины]]></title>
			<link>https://forum.readyscript.ru/post/3150/#p3150</link>
			<description><![CDATA[<p>Логика работы корзины следующая:</p><p><strong>Когда пользователь неавторизован:</strong><br />- Товары попадают в БД и связаны по session_id <br /><em>(логика видна в методе \Shop\Model\Cart::__construct)</em></p><p><strong>Когда пользователь авторизовывается и у него есть товары в корзине:</strong><br />- Товары, которые были привязаны&nbsp; user_id до этого удаляются (т.к. пользователь собрал новую корзину)<br />- Новые товары дополнительно привязываются к user_id </p><p><strong>Когда пользователь авторизовывается и у него нет товаров в корзине</strong><br />- Товары, которые были привязаны к user_id привязываются к session_id <br />(т.е. пользователь видит товары, которые он собирал будучи авторизованным, например, на другом компьютере)</p><p><em>(логика трансформаций при авторизации видна в \Shop\Config\Handlers::userAuth)</em></p><p><strong>Когда пользователь авторизован:</strong><br />- Товары попадают в БД и у них проставляются session_id, user_id</p><p>------------------------------------</p><p>Выборка товаров в корзину из БД ведется всегда по session_id. (user_id - это дополнительный идентификатор, который позволяет производить манипуляции по перепривязке товаров при авторизации)</p><p>Теоретически, корзина может пропадать у пользователей, только если наступает завершение сессии, т.е. происходит смена session_id, т.е. пауза между действиями пользователя на сайте превышает настройку session.gc_maxlifetime в php.ini</p>]]></description>
			<author><![CDATA[null@example.com (admin)]]></author>
			<pubDate>Fri, 06 May 2016 09:11:22 +0000</pubDate>
			<guid>https://forum.readyscript.ru/post/3150/#p3150</guid>
		</item>
	</channel>
</rss>
