<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
	<title type="html"><![CDATA[Форум ReadyScript &mdash; Скидка от суммы и подытога корзины]]></title>
	<link rel="self" href="https://forum.readyscript.ru/feed/atom/topic/296/" />
	<updated>2015-03-16T16:29:41Z</updated>
	<generator>PunBB</generator>
	<id>https://forum.readyscript.ru/topic/296/skidka-ot-summy-i-podytoga-korziny/</id>
		<entry>
			<title type="html"><![CDATA[Re: Скидка от суммы и подытога корзины]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/1025/#p1025" />
			<content type="html"><![CDATA[<p>Благодарю за помощь!<br />После OpenCart одно удовольствие расширять систему. Никаких VQMod</p>]]></content>
			<author>
				<name><![CDATA[Ярослав]]></name>
				<uri>https://forum.readyscript.ru/user/74/</uri>
			</author>
			<updated>2015-03-16T16:29:41Z</updated>
			<id>https://forum.readyscript.ru/post/1025/#p1025</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скидка от суммы и подытога корзины]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/1024/#p1024" />
			<content type="html"><![CDATA[<p>Я не учел, что вы выставляете тип цен только во время события - cart.addproduct.<br />Вам тогда нужно в обработчике события cart.addproduct писать цену пользователя в $_SESSION[&#039;КАКАЯ_НИБУДЬ_ПЕРЕМЕННАЯ&#039;]</p><p>А потом сделать еще один обработчик события <strong>start</strong> и уже в нем вызывать:<br /></p><div class="codebox"><pre><code>if (  $_SESSION[&#039;КАКАЯ_НИБУДЬ_ПЕРЕМЕННАЯ&#039;] ) {
\Catalog\Model\CostApi::setSessionDefaultCost( $_SESSION[&#039;КАКАЯ_НИБУДЬ_ПЕРЕМЕННАЯ&#039;] );
}</code></pre></div><p>------</p><p>\Catalog\Model\CostApi::setSessionDefaultCost() - устанавливает текущую цену на одну сессию выполнения PHP (не путать с SESSION).&nbsp; Т.е. её нужно вызывать её каждый раз.</p>]]></content>
			<author>
				<name><![CDATA[admin]]></name>
				<uri>https://forum.readyscript.ru/user/2/</uri>
			</author>
			<updated>2015-03-16T12:19:36Z</updated>
			<id>https://forum.readyscript.ru/post/1024/#p1024</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скидка от суммы и подытога корзины]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/1023/#p1023" />
			<content type="html"><![CDATA[<p>Если пользователь не авторизован, то у него всегда - тип цен &quot;по-умолчанию&quot;. <br />Т.е. это будет работать и для не авторизованных.</p>]]></content>
			<author>
				<name><![CDATA[admin]]></name>
				<uri>https://forum.readyscript.ru/user/2/</uri>
			</author>
			<updated>2015-03-16T12:13:50Z</updated>
			<id>https://forum.readyscript.ru/post/1023/#p1023</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скидка от суммы и подытога корзины]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/1021/#p1021" />
			<content type="html"><![CDATA[<p>Пользователь должен быть авторизирован или это для текущей сессии любого пользователя?</p>]]></content>
			<author>
				<name><![CDATA[Ярослав]]></name>
				<uri>https://forum.readyscript.ru/user/74/</uri>
			</author>
			<updated>2015-03-16T12:07:09Z</updated>
			<id>https://forum.readyscript.ru/post/1021/#p1021</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скидка от суммы и подытога корзины]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/1019/#p1019" />
			<content type="html"><![CDATA[<p>Да, если у пользователя в настройках установлен - тип цен: &quot;по-умолчанию&quot;, <br />то можно воспользоваться этим методом - \Catalog\Model\CostApi::setSessionDefaultCost()</p>]]></content>
			<author>
				<name><![CDATA[admin]]></name>
				<uri>https://forum.readyscript.ru/user/2/</uri>
			</author>
			<updated>2015-03-16T11:03:45Z</updated>
			<id>https://forum.readyscript.ru/post/1019/#p1019</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скидка от суммы и подытога корзины]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/1016/#p1016" />
			<content type="html"><![CDATA[<p>Спасибо большое! Заработало как надо!</p><p>А есть ли возможность принудительно устанавливать текущий CostId без модификации costapi?<br />Это метод \Catalog\Model\CostApi::setSessionDefaultCost()?</p>]]></content>
			<author>
				<name><![CDATA[Ярослав]]></name>
				<uri>https://forum.readyscript.ru/user/74/</uri>
			</author>
			<updated>2015-03-16T10:47:30Z</updated>
			<id>https://forum.readyscript.ru/post/1016/#p1016</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Re: Скидка от суммы и подытога корзины]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/1013/#p1013" />
			<content type="html"><![CDATA[<p>Внутри объекта товара $product - сохраняется идентификатор цены cost_id в поле _current_cost_id. <br />Именно закешированное значение _current_cost_id используется при вызове метода получения цены у товара $product-&gt;getCost(null), без явного указания id цены. Необходимо подменить значение _current_cost_id в кэш-поле товара.</p><p>Попробуйте выполнить следующий код для пересчета - </p><div class="codebox"><pre><code>//Заменим закешированный _current_cost_id у объекта товара
foreach($cart-&gt;getProductItems() as $cartdata) {
    $cartdata[&#039;product&#039;][&#039;_current_cost_id&#039;] = ID новой цены;
}

//Очистим сведения для блока корзины
$cart-&gt;cleanInfoCache();</code></pre></div><p>Насчет события для удаления элемента из корзины. Добавим в ближайшем обновлении.<br />Функция removeItem($uniq) будет выглядеть так: (можете заменить её прямо в файле cart.inc.php)</p><div class="codebox"><pre><code>    function removeItem($uniq)
    {
        $eresult = \RS\Event\Manager::fire(&#039;cart.removeitem.before&#039;, array(
            &#039;cart&#039; =&gt; $this,
            &#039;uniq&#039; =&gt; $uniq
        ));    
        if ($eresult-&gt;getEvent()-&gt;isStopped()) return false;
                
        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)
                    -&gt;where(array(
                        &#039;uniq&#039; =&gt; $uniq
                    ))-&gt;exec();
            }
            
            $deleted_item = $this-&gt;items[$uniq];
            unset($this-&gt;items[$uniq]);
            unset($this-&gt;order_items[$uniq]);
            unset($this-&gt;cache_products[$uniq]);
            unset($this-&gt;cache_coupons[$uniq]);

            \RS\Event\Manager::fire(&#039;cart.removeitem.after&#039;, array(
                &#039;cart&#039; =&gt; $this,
                &#039;uniq&#039; =&gt; $uniq,
                &#039;item&#039; =&gt; $deleted_item
            ));            
        }
        return true;
    }</code></pre></div>]]></content>
			<author>
				<name><![CDATA[admin]]></name>
				<uri>https://forum.readyscript.ru/user/2/</uri>
			</author>
			<updated>2015-03-16T07:50:34Z</updated>
			<id>https://forum.readyscript.ru/post/1013/#p1013</id>
		</entry>
		<entry>
			<title type="html"><![CDATA[Скидка от суммы и подытога корзины]]></title>
			<link rel="alternate" href="https://forum.readyscript.ru/post/1011/#p1011" />
			<content type="html"><![CDATA[<p>Заказчик дал следующее ТЗ:<br />&quot;Здравствуйте! Необходимо реализовать смену типа цены товаров и пересчет суммы корзины для текущей сессии аналогично sotomore.ru<br />1. Тип цены текущего пользователя зависит от подытога текущей корзины. <br />Например:<br />0-10 000 = тип цены розничная с ID=2<br />10001-50000 = тип цены опт1 с ID=3<br />50001-100000 = тип цены опт2 с ID=23&quot;</p><p>Немного изменил cost.api, чтобы тип цены по-умолчанию брался из сессии.</p><p>Далее написал обработчик события:<br /></p><div class="codebox"><pre><code>&lt;?php

namespace Opt\Config;

class Handlers extends \RS\Event\HandlerAbstract
{
    function init()
    {
        $this-&gt;bind(&#039;cart.addproduct.after1&#039;)
            -&gt;bind(&#039;cart.update.after&#039;);
    }    
    
   public static function checkprice($info)
    {
         //\Catalog\Model\CostApi::setSessionDefaultCost(2); 
          if (!$_SESSION[&#039;user_cost_id&#039;]) {
                $_SESSION[&#039;user_default_cost_id&#039;]=\Catalog\Model\CostApi::getDefaultCostId();
                $cost_id=\Catalog\Model\CostApi::getDefaultCostId() ;
         }  
           else   $cost_id=$_SESSION[&#039;user_cost_id&#039;];
                                                    
         $cart=$info[&#039;cart&#039;];      
         $cartinfo = $cart-&gt;getCartData(false,false);
         flog($cost_id);    //вывод в консоль firebug                          
         flog( $cartinfo[&#039;total&#039;]);   
          
         if ((  $cartinfo[&#039;total&#039;]&lt;50000) &amp;&amp;( $cost_id!=1)) 
         {       
             flog(&#039;yes&#039;);
             $_SESSION[&#039;user_cost_id&#039;]=1;  
             //здесь необходимо обновить корзину            
             
        }
         elseif ((  $cartinfo[&#039;total&#039;]&gt;=50000)&amp;&amp;( $cost_id!=2)) 
         {       
              flog(&#039;yes2&#039;);
              $_SESSION[&#039;user_cost_id&#039;]=2; 
              //здесь необходимо обновить корзину   
            
         };
 
     return $info;    
    }
  public static function cartUpdateAfter ($info)
    {  
    
       $result=self::checkprice($info);           
       return $result;     
           
    }
      
                           
   public static function cartAddproductAfter ($info)
    {  
           $result=self::checkprice($info);           
          return $result;
    }
    
}</code></pre></div><p>====</p><p>но не ясно как перерасчитать корзину после смены ID типа цены в сессии $_SESSION[&#039;user_cost_id&#039;] .</p><p>Пробовал разные методы модели корзины, но&nbsp; итог меняется только при следующем изменении корзины.</p><p>Например:<br />Товар с ценой 1=12000 и ценой2 = 10000. Цена1 меняется на цену2 после 50 000 руб.<br />при количестве 4 в корзине Итог= 48 000 руб<br />при количестве 5 в корзине Итог= 60 000 руб (меняется тип цены=цена2=10000)<br />при количестве 6 в корзине Итог= 60 000 руб<br />уменьшаем<br />при количестве 5 в корзине Итог= 50 000 руб <br />при количестве 4 в корзине Итог= 40 000 руб(тип цены меняется цена=цена1=12000)</p><br /><p>Подскажите, пожалуйста, как же пересчитать элементы корзины и итог при изменении типа цены?</p><p>p.s. Так же не хватает событий на удаление из корзины в стандартной поставке.</p>]]></content>
			<author>
				<name><![CDATA[Ярослав]]></name>
				<uri>https://forum.readyscript.ru/user/74/</uri>
			</author>
			<updated>2015-03-15T17:20:40Z</updated>
			<id>https://forum.readyscript.ru/post/1011/#p1011</id>
		</entry>
</feed>
