Цены с дробными значениями

Всех с наступившим Новым годом.

Стоит 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 маловато. Может кто делал что-нибудь подобное например, для копеек или для фильтрации веса?

Очень буду благодарен за помощь.
Romancho
04 января 2015, 20:49
modx.pro
3 533
0

Комментарии: 12

Василий Наумкин
05 января 2015, 07:32
0
Скорее всего, здесь не в php проблема, а в jQuery Slider.

Попробуй вводить цифры для фильтрации вручную — что получится?
    Василий Наумкин
    05 января 2015, 08:00
    0
    Если фильтрация вручную работает, значит нужно переименовать default.js, указать в настройках новое имя и добавить параметр
    ,step: 0.1
    где то вот здесь, чтобы включить дробный шаг слайдера.

    Докуметация по jQueryUI Slider.
      Romancho
      05 января 2015, 15:08
      0
      В ручную разделитель в input не вводится. Попробовал добавить step:0.1, — пока двигаешь слайдер — всё вроде как нормально, хотя у max значение вида 2.900000 становится. Отпускается бегунок, max и min меняются местами. Ради смеха вернул всё как было везде и в default.js сменил range на false. Стало также кашей работать — менять min и max местами. Т.е. и в первом случае он ранжировал как-то по своему? Окончательно запутался.
        Василий Наумкин
        05 января 2015, 15:13
        0
        Что-то мне кажется, что у тебя в чанках каша, раз меняются местами min и max.

        Проверь-ка исходный код страницы, может там и вправду они поменяны?
          Romancho
          05 января 2015, 15:16
          0
          Сейчас проверю конечно, но если всё вернуть как было. Т.е. без дробных чисел, т.е. как по умолчанию — всё работает аки швейцарские часы — бред начинается, когда я убираю округление в buildNumberFilter и NumberFilter floor у min и ceil у max. Именно с этого места.
            Romancho
            05 января 2015, 15:24
            0
            Да уж какая тут может быть каша

            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>
            Понятно, что чудес не бывает и мистики с магией. Бывает не хватка знаний или невнимательность.
              Василий Наумкин
              05 января 2015, 15:40
              0
              Исходный код страницы — это не исходный код чанка.

              В странице должно быть что-то вроде такого:
              <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 — большее. Вот это и нужно проверить.

              А вообще, если ты покупал дополнение — пиши вопрос в техподдержке магазина и давай доступы к сайту, чтобы я мог посмотреть. Надоело гадать в слепую.
                Romancho
                05 января 2015, 17:43
                0
                Написал в поддержку. :)
      Romancho
      05 января 2015, 15:19
      0
      Пытаюсь так:
      Для buildNumberFilter
      $min = round(array_shift($tmp),1);
      $max = round(array_pop($tmp),1);
      Для filterNumber:
      $min = round(min($requested),1);
      $max = round(max($requested),1);
        Дмитрий
        07 июня 2016, 15:46
        0
        Здравствуйте! Вам удалось решить проблему с дробными числами?
          Romancho
          07 июня 2016, 17:09
          0
          Проблема была решена Василием, дописано условие, насколько я помню. И сейчас это исправление уже давно присутствует в дистрибутиве. Надо искать в коммитах за тот период.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      12