<?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>http://forum.readyscript.ru/topic/443/kak-dobavit-polzunok-tseny-v-kategorii/</link>
		<atom:link href="http://forum.readyscript.ru/feed/rss/topic/443/" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «Как добавить ползунок цены в категории?».]]></description>
		<lastBuildDate>Tue, 25 Aug 2015 11:46:53 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[Re: Как добавить ползунок цены в категории?]]></title>
			<link>http://forum.readyscript.ru/post/1779/#p1779</link>
			<description><![CDATA[<p>Отличная новость!</p>]]></description>
			<author><![CDATA[null@example.com (Sergey T.)]]></author>
			<pubDate>Tue, 25 Aug 2015 11:46:53 +0000</pubDate>
			<guid>http://forum.readyscript.ru/post/1779/#p1779</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как добавить ползунок цены в категории?]]></title>
			<link>http://forum.readyscript.ru/post/1777/#p1777</link>
			<description><![CDATA[<p>В одном из ближайших обновлений этого можно будет избежать. В настройках модуля каталог появится флажок &quot;Показывать фильтр по цене в виде слайдера&quot;. Если его установить, то всё будет работать сразу.</p>]]></description>
			<author><![CDATA[null@example.com (Александр)]]></author>
			<pubDate>Tue, 25 Aug 2015 10:46:19 +0000</pubDate>
			<guid>http://forum.readyscript.ru/post/1777/#p1777</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как добавить ползунок цены в категории?]]></title>
			<link>http://forum.readyscript.ru/post/1740/#p1740</link>
			<description><![CDATA[<p>Получилось?</p>]]></description>
			<author><![CDATA[null@example.com (Александр)]]></author>
			<pubDate>Fri, 21 Aug 2015 07:18:19 +0000</pubDate>
			<guid>http://forum.readyscript.ru/post/1740/#p1740</guid>
		</item>
		<item>
			<title><![CDATA[Re: Как добавить ползунок цены в категории?]]></title>
			<link>http://forum.readyscript.ru/post/1737/#p1737</link>
			<description><![CDATA[<p>Интересный вопрос и сейчас я его раскрою. <br />Дело в том, что в системе для того, чтобы сформировать данный ползунок нужно каким-то образом получить максимальную и минимальную цену в зависимости от категории и применённых фильтров. По умолчанию мы не поддерживаем такое получение и не возвращаем сведений, поэтому придётся немного поколдовать, чтобы получить данные.<br />Первое что надо сделать это получить данные во фронт контроллере списка товаров, т.к. именно в нём применяются все фильтры. Соответственно там мы и должны получать данные.<br />Нам надо сделать копию файла <br /><strong>/modules/catalog/controller/front/listproducts.inc.php</strong> с таким же именем, но окончанием .my.inc.php</p><p>т.е.<br /><strong>/modules/catalog/controller/front/listproducts.my.inc.php</strong></p><p>Откроем его и посмотрим в метод <strong>actionIndex()</strong>.</p><p>Нам надо заменить:<br /></p><div class="codebox"><pre><code>$basefilter = $this-&gt;api-&gt;applyBaseFilters();
$total      = $this-&gt;api-&gt;getMultiDirCount();
                            
$this-&gt;api-&gt;queryObj()-&gt;groupby($this-&gt;api-&gt;defAlias().&#039;.id&#039;);
//Устанавливаем сортировку
$sort_field = $this-&gt;cur_sort == &#039;rank&#039; ? $this-&gt;cur_sort : $this-&gt;api-&gt;defAlias().&#039;.&#039;.$this-&gt;cur_sort;
$this-&gt;api-&gt;setSortOrder($sort_field, $this-&gt;cur_n_sort);</code></pre></div><p>На:<br /></p><div class="codebox"><pre><code>/**
* @var \RS\Orm\Request
*/
$minmaxQuery = clone $this-&gt;api-&gt;queryObj();                                                  
                
$basefilter = $this-&gt;api-&gt;applyBaseFilters();
$total      = $this-&gt;api-&gt;getMultiDirCount();
                
//Добавим цены к запросу
$current_cost_type = \Catalog\Model\CostApi::getUserCost(); //Текущий тип цен
$current_cost_type = \Catalog\Model\CostApi::getInstance()-&gt;getManualType($current_cost_type);
$minmaxQuery-&gt;leftjoin(new \Catalog\Model\Orm\Xcost(), &quot;A.id = XC.product_id AND XC.cost_id=&#039;{$current_cost_type}&#039;&quot;, &#039;XC&#039;);

$minmaxQuery-&gt;orderby(&#039;&#039;); 
$minmaxQuery-&gt;select = &#039;max(XC.cost_val) interval_to,min(XC.cost_val) interval_from&#039;;
$moneyArray = $minmaxQuery-&gt;exec()-&gt;fetchRow();
$moneyArray[&#039;step&#039;]  = 1;
$moneyArray[&#039;round&#039;] = 1;
$moneyArray[&#039;unit&#039;]  = \Catalog\Model\CurrencyApi::getDefaultCurrency()-&gt;stitle;
$moneyArray[&#039;heterogeneity&#039;]  = $this-&gt;getHeterogeneity($moneyArray[&#039;interval_from&#039;],$moneyArray[&#039;interval_to&#039;]);
                
$this-&gt;router-&gt;getCurrentRoute()-&gt;money_array = $moneyArray;
                            
$this-&gt;api-&gt;queryObj()-&gt;groupby($this-&gt;api-&gt;defAlias().&#039;.id&#039;);
$this-&gt;api-&gt;setSortOrder($this-&gt;api-&gt;defAlias().&#039;.&#039;.$this-&gt;cur_sort, $this-&gt;cur_n_sort);</code></pre></div><p>В указанном выше кусочке кода мы получаем массив <strong>$moneyArray</strong> на основе запроса максимальной и минимальной цены для формирования данных, которые нам понадобятся в шаблоне. <br />Эти значения мы поместим в наш класс роута который будет доступен по данному url в любом блок контроллере с помощью</p><div class="codebox"><pre><code>$this-&gt;router-&gt;getCurrentRoute()-&gt;money_array = $moneyArray;</code></pre></div><p>Это нам понадобится, чтобы передать в блок контроллер фильтров данные значения. Т.к. первым отработает фронт контроллер, то после него отработают блок контроллеры из обёртки. А это позволит нам передать туда наши данные для дальнейшего помещения в шаблон.</p><p>Функция <strong>getHeterogeneity</strong> это функция, которая подготавливает массив для рисочек нашего ползунка.<br />Теперь добавим эту функцию в наш класс.<br /></p><div class="codebox"><pre><code>/**
* Получает риски для цен диапозона цен
* 
* @return string
*/
function getHeterogeneity($min,$max){
       $max = floatval($max); 
       $min = floatval($min); 
       //Проверим возможно ли это
       if ($max==$min) return &quot;&quot;;
       $delta = $max-$min;
       $d25 = ceil($min + (($delta/100)*25)); 
       $d50 = ceil($min + (($delta/100)*50)); 
       $d75 = ceil($min + (($delta/100)*75)); 
       return &#039;&quot;25/&#039;.$d25.&#039;&quot;,&quot;50/&#039;.$d50.&#039;&quot;,&quot;75/&#039;.$d75.&#039;&quot;&#039;;
}</code></pre></div><p>С этой часть мы покончили. Теперь нам необходимо перейти к блок контроллеру фильтров в которых обработать наши сведения и поместить в шаблон фильтров дополнительные сведения. <br />Для этого делаем копию блок контроллера фильтров</p><p><strong>/modules/catalog/controller/block/sidefilters.inc.php</strong></p><p>и&nbsp; также</p><p><strong>/modules/catalog/controller/block/sidefilters.my.inc.php</strong></p><p>И заходим в класс <strong>SideFilters</strong> нашего нового файла в метод <strong>actionIndex()</strong>.</p><p>Добавим в шаблон в массив через $this-&gt;view-&gt;assign новый элемента массива</p><div class="codebox"><pre><code>$this-&gt;view-&gt;assign(array(
     ...
     &#039;moneyArray&#039; =&gt; $this-&gt;router-&gt;getCurrentRoute()-&gt;money_array,
     ...
));</code></pre></div><p>Троеточие используется для примера данных.</p><p>Теперь нам нужен шаблон &quot;blocks/sidefilters/filters.tpl&quot; (У каждой темы соответственно в своей папке). <br />Строки, которые отвечают у нас за отображение фильтра надо заменить на:</p><div class="codebox"><pre><code>{if $param.show_cost_filter}
                        &lt;div class=&quot;priceFilter typeInterval&quot;&gt;
                            &lt;span class=&quot;title&quot;&gt;Цена:&lt;/span&gt;
                            &lt;div class=&quot;typeInterval fromToPrice&quot;&gt;
                                &lt;input type=&quot;hidden&quot; class=&quot;textinp fromto&quot; name=&quot;bfilter[cost][from]&quot; value=&quot;{$basefilters.cost.from}&quot; data-start-value=&quot;&quot;&gt;
                                &lt;input type=&quot;hidden&quot; class=&quot;textinp fromto&quot; name=&quot;bfilter[cost][to]&quot; value=&quot;{$basefilters.cost.to}&quot; data-start-value=&quot;&quot;&gt;
                            &lt;/div&gt;
                            
                            &lt;div class=&quot;priceInterval fromToLine&quot;&gt;               
                                &lt;input type=&quot;hidden&quot; data-slider=&#039;{ &quot;from&quot;:{$moneyArray.interval_from}, &quot;to&quot;:{$moneyArray.interval_to}, &quot;step&quot;: &quot;{$moneyArray.step}&quot;, &quot;round&quot;: {$moneyArray.round}, &quot;dimension&quot;: &quot; {$moneyArray.unit}&quot;, &quot;heterogeneity&quot;: [{$moneyArray.heterogeneity}]  }&#039; value=&quot;{$basefilters.cost.from|default:$moneyArray.interval_from};{$basefilters.cost.to|default:$moneyArray.interval_to}&quot; class=&quot;pluginInput&quot; data-closest=&quot;.fromToPrice&quot; data-start-value=&quot;{$basefilters.cost.from|default:$moneyArray.interval_from};{$basefilters.cost.to|default:$moneyArray.interval_to}&quot;&gt;
                            &lt;/div&gt;  
                            &lt;input type=&quot;submit&quot; value=&quot;Применить&quot; class=&quot;onemore submitFilter&quot; style=&quot;display:none;&quot;/&gt;
   &lt;/div&gt;
{/if}</code></pre></div><p>html у нас готов теперь надо активировать js.<br />В примере я воспользуюсь нашим стандартным слайдером (<strong>jslider - jquery.slider.min.js</strong>), который есть во всех наших темах. <br />У нас это указано так.</p><br /><div class="codebox"><pre><code>&lt;script type=&quot;text/javascript&quot;&gt;
                $(function() {
                    $(&#039;.typeInterval .pluginInput&#039;).each(function() {
                        var $this = $(this);
                        
                        var fromTo = $($this.data(&#039;closest&#039;));  
                        fromTo.hide(); 
                        $this.jslider( $.extend( $(this).data(&#039;slider&#039;), { callback: function(value) {
                            
                            var values = value.split(&#039;;&#039;);
                            $(&#039;input[name$=&quot;[from]&quot;]&#039;, fromTo).val(values[0]);
                            $(&#039;input[name$=&quot;[to]&quot;]&#039;, fromTo).val(values[1]);
                            $this.trigger(&#039;change&#039;);
                        }}));
                        
                        $(&#039;input[name$=&quot;[from]&quot;], input[name$=&quot;[to]&quot;]&#039;, fromTo).change(function() {
                            var from = $(&#039;input[name$=&quot;[from]&quot;]&#039;, fromTo).val();
                            var to = $(&#039;input[name$=&quot;[to]&quot;]&#039;, fromTo).val();
                            $this.jslider(&#039;value&#039;, from, to);
                        });
                    });
&lt;/script&gt;</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Александр)]]></author>
			<pubDate>Thu, 20 Aug 2015 13:35:08 +0000</pubDate>
			<guid>http://forum.readyscript.ru/post/1737/#p1737</guid>
		</item>
		<item>
			<title><![CDATA[Как добавить ползунок цены в категории?]]></title>
			<link>http://forum.readyscript.ru/post/1736/#p1736</link>
			<description><![CDATA[<p>Задача: добавить ползунок цены в категорию.</p><p>1) минимум/максимум - это наим./наиб. стоимость товара в текущей категории/подкатегории.<br />2) если мы находимся в категории, то наим./наиб. стоимость берется включая все товары этой категории и подкатегорий в ней.<br />3) если находимся в подкатегории, то наим./наиб. стоимость берется включая товары этой подкатегории и подкатегорий в ней, далее по той же логике подподкатегории (то есть исключать родителей).<br />4) скрывать ползунок, если товаров менее двух или цена их равна (почти так же, как сейчас работают другие фильтры).</p>]]></description>
			<author><![CDATA[null@example.com (Дмитрий)]]></author>
			<pubDate>Thu, 20 Aug 2015 09:49:06 +0000</pubDate>
			<guid>http://forum.readyscript.ru/post/1736/#p1736</guid>
		</item>
	</channel>
</rss>
