Цены с дробными значениями
        Всех с наступившим Новым годом.
Стоит minishop2 и mFilter2.
Возник такой вопрос — мне необходимо фильтр цен со слайдером сделать по значениям, которые имеют дробные значения. 0.7-1.2
Завел в базе новое поле «exprice» [DECIMAL, 12,2], прописал в его msproductdata.map.inc.php
Вызываю:
Пытаюсь отобразить и профильтровать в фильтре значения цены 0.2; 0.7; 1.6
Пока зывает либо 0, либо 1, либо 2
Понятно, что округляет.
Пытаюсь изменить (удаляю в min и max floor и ceil) :number в родном файле (пока просто пробую — потом отдельный custom заведу) /core/components/msearch2/model/msearch2/filters.class.php
Знаний php маловато. Может кто делал что-нибудь подобное например, для копеек или для фильтрации веса?
Очень буду благодарен за помощь.
    
    
                                                                                
            Стоит minishop2 и mFilter2.
Возник такой вопрос — мне необходимо фильтр цен со слайдером сделать по значениям, которые имеют дробные значения. 0.7-1.2
Завел в базе новое поле «exprice» [DECIMAL, 12,2], прописал в его msproductdata.map.inc.php
<?php
return array(
           'fields' => array(
                        'exprice' => NULL
            )            
           ,'fieldMeta' => array(
                        'exprice' => array(
                                'dbtype' => 'decimal',
                                'precision' => '12,2',
                                'phptype' => 'float',
                                'null' => false,
                                'default' => 0,
                        )
            )
            ,'indexes' => array(
                        'exprice' => array (
                                    'alias' => 'exprice'
                                    ,'primary' => false
                                    ,'unique' => false
                                    ,'type' => 'BTREE'
                                    ,'columns' => array (
                                                'action' => array (
                                                            'length' => ''
                                                            ,'collation' => 'A'
                                                           ,'null' => false
                                                )
                                    )
                       )
            )
);В msproductdata.js вписал поле:miniShop2.plugin.exprice = {
            getFields: function(config) {
                        return {
                                    exprice: {xtype: 'numberfield', description: '<b>[[+exprice]]</b><br />'+_('ms2_product_exprice_help')}
                        }
            }
            ,getColumns: function() {
                        return {
                                    exprice: {width:50, sortable:false, editor: {xtype:'numberfield', name: 'exprice'}}
                        }
            }
};Все работает, сохраняет, отображает и показывает и ищет в фильтре.Вызываю:
[[!mFilter2?
					&paginator=`getPage`
					&limit=`16`
					&element=`msProducts`
					&filters=`
						parent:categories,
						ms|exprice:number,
						ms|favorite:boolean`
					&tplFilter.outer.ms|exprice=`tpl.mFilter2.price.slider`
					&tplFilter.row.ms|exprice=`tpl.mFilter2.price.number`
]]Опять вроде всё работает.Пытаюсь отобразить и профильтровать в фильтре значения цены 0.2; 0.7; 1.6
Пока зывает либо 0, либо 1, либо 2
Понятно, что округляет.
Пытаюсь изменить (удаляю в min и max floor и ceil) :number в родном файле (пока просто пробую — потом отдельный custom заведу) /core/components/msearch2/model/msearch2/filters.class.php
public function buildNumberFilter(array $values, $name = '') {
		$tmp = array_keys($values);
		if (empty($values) || (count($tmp) < 2 && empty($this->config['showEmptyFilters']))) {
			return array();
		}
		sort($tmp);
		if (count($values) >= 2) {
			$min = array_shift($tmp);
			$max = array_pop($tmp);
		}
		else {
			$min = $max = $tmp[0];
		}
		return array(
			array(
				'title' => $this->modx->lexicon('mse2_filter_number_min')
				,'value' => $min
				,'type' => 'number'
				,'resources' => null
			)
			,array(
				'title' => $this->modx->lexicon('mse2_filter_number_max')
				,'value' => $max
				,'type' => 'number'
				,'resources' => null
			)
		);
	}иpublic function filterNumber(array $requested, array $values, array $ids) {
		$matched = array();
		$min = min($requested);
		$max = max($requested);
		$tmp = array_flip($ids);
		foreach ($values as $number => $resources) {
			if ($number >= $min && $number <= $max) {
				foreach ($resources as $id) {
					if (isset($tmp[$id])) {
						$matched[] = $id;
					}
				}
			}
		}
		return $matched;
	}Отображает нормально дробные числа, а фильтрует как ему в голову придет — вообще от балды как будто — полная каша. При сдвиге слайдера в интервал от 0.7 до 3 в URL пишет ?ms|exprice=3,0.7, а сам слайдер и значения в input 3/3 становятсяЗнаний php маловато. Может кто делал что-нибудь подобное например, для копеек или для фильтрации веса?
Очень буду благодарен за помощь.
Комментарии: 12
                Скорее всего, здесь не в php проблема, а в jQuery Slider. 
Попробуй вводить цифры для фильтрации вручную — что получится?
                    Попробуй вводить цифры для фильтрации вручную — что получится?
                Если фильтрация вручную работает, значит нужно переименовать default.js, указать в настройках новое имя и добавить параметр
Докуметация по jQueryUI Slider.
                    ,step: 0.1где то вот здесь, чтобы включить дробный шаг слайдера.Докуметация по jQueryUI Slider.
                В ручную разделитель в input не вводится. Попробовал добавить step:0.1, — пока двигаешь слайдер — всё вроде как нормально, хотя у max значение вида 2.900000 становится. Отпускается бегунок, max и min меняются местами. Ради смеха вернул всё как было везде и в default.js сменил range на false. Стало также кашей работать — менять min и max местами. Т.е. и в первом случае он ранжировал как-то по своему? Окончательно запутался.            
                    
                Что-то мне кажется, что у тебя в чанках каша, раз меняются местами min и max.
Проверь-ка исходный код страницы, может там и вправду они поменяны?
                    Проверь-ка исходный код страницы, может там и вправду они поменяны?
                Сейчас проверю конечно, но если всё вернуть как было. Т.е. без дробных чисел, т.е. как по умолчанию — всё работает аки швейцарские часы — бред начинается, когда я убираю округление в buildNumberFilter и NumberFilter floor у min и ceil у max. Именно с этого места.            
                    
                Да уж какая тут может быть каша
tpl.mFilter2.price.number:
                    tpl.mFilter2.price.number:
<label for="mse2_[[+table]][[+delimeter]][[+filter]]_[[+idx]]"><span>[[+title]]</span>
		<input type="text" name="[[+table]][[+delimeter]][[+filter]]" id="mse2_[[+table]][[+delimeter]][[+filter]]_[[+idx]]" value="[[+value]]"/> 
	</label>tpl.mFilter2.price.slider:<fieldset id="mse2_[[+table]][[+delimeter]][[+filter]]">
	<div class="filter-title">[[%mse2_filter_[[+table]]_[[+filter]]]]</div>
	<div class="mfilter-price dark">
		<p>
			[[+rows]]<span>Млн. руб.</span>
		</p>
<!--Дизайнерские красивости-->
		<div class="slider-bg">
		<span class="track-start">0</span><span class="track-middle">7</span><span class="track-finish">14</span>
			<div class="mse2_number_slider"></div>
		</div>
<!--Конец дизайнерским красивостям-->
	</div>
</fieldset>Понятно, что чудес не бывает и мистики с магией. Бывает не хватка знаний или невнимательность.            
                Исходный код страницы — это не исходный код чанка.
В странице должно быть что-то вроде такого:
А вообще, если ты покупал дополнение — пиши вопрос в техподдержке магазина и давай доступы к сайту, чтобы я мог посмотреть. Надоело гадать в слепую.
                    В странице должно быть что-то вроде такого:
<h4>Цена</h4>
<div class="mse2_number_slider"></div>
<div class="mse2_number_inputs">
	<div class="form-group col-md-6">
	<label for="mse2_ms|price_0">От
		<input type="input" name="ms|price" id="mse2_ms|price_0" value="0" class="form-control input-sm" />
	</label>
</div><div class="form-group col-md-6">
	<label for="mse2_ms|price_1">До
		<input type="input" name="ms|price" id="mse2_ms|price_1" value="3999" class="form-control input-sm" />
	</label>
</div>price_0 — меньшее число, price_1 — большее. Вот это и нужно проверить.А вообще, если ты покупал дополнение — пиши вопрос в техподдержке магазина и давай доступы к сайту, чтобы я мог посмотреть. Надоело гадать в слепую.
                Написал в поддержку. :)            
                    
                Пытаюсь так:
Для buildNumberFilter
                    Для buildNumberFilter
$min = round(array_shift($tmp),1);
$max = round(array_pop($tmp),1);Для filterNumber:$min = round(min($requested),1);
$max = round(max($requested),1);            
                Здравствуйте! Вам удалось решить проблему с дробными числами?            
                    
                Проблема была решена Василием, дописано условие, насколько я помню. И сейчас это исправление уже давно присутствует в дистрибутиве. Надо искать в коммитах за тот период.            
                    
                спасибо за ответ            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.