Цены с дробными значениями
Всех с наступившим Новым годом.
Стоит 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);
Здравствуйте! Вам удалось решить проблему с дробными числами?
Проблема была решена Василием, дописано условие, насколько я помню. И сейчас это исправление уже давно присутствует в дистрибутиве. Надо искать в коммитах за тот период.
спасибо за ответ
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.