@SteepNET

Умный фильтр ,значения «От»,"До" заменить на значения минимум и максимум?

Добрый день! Встретился с проблемой , хочется в умном фильтре в полях ввода максимального и минимального значения , те которые с ползунком , поместить эти значения, по умолчанию в этих полях просто надписи "От" и "До".
Можно поместить конечно в placeholder="<?=$arItem["VALUES"]["MIN"]["VALUE"]?>" но это опять же не очень красиво, потому как значений нет на самом деле в полях.
/bitrix/www/bitrix/components/bitrix/catalog.smart.filter/templates/bootstrap_v4/template.php ~80 строка
<div class="smart-filter-input-container">
<input
         class="min-price form-control form-control-sm"
         type="number"
         name="<? echo $arItem["VALUES"]["MIN"]["CONTROL_NAME"] ?>"
         id="<? echo $arItem["VALUES"]["MIN"]["CONTROL_ID"] ?>"
         value="<? echo $arItem["VALUES"]["MIN"]["HTML_VALUE"] ?>"
         size="5"
         placeholder="<?=$arItem["VALUES"]["MIN"]["VALUE"]?>"
         onkeyup="smartFilter.keyup(this)"
          />
</div>


Пробовал в value поместить
<?=($arItem["VALUES"]["MIN"]["HTML_VALUE"]) ? round($arItem["VALUES"]["MIN"]["HTML_VALUE"]) : ($arItem["VALUES"]["MIN"]["VALUE"])?>


Все работает ,но когда бегунок сдвинешь, и вернешь на максимальное или минимальное значение , поле становиться пустым...

Думаю что тут дело еще в JS
spoiler
$arJsParams = array(
"leftSlider" => 'left_slider_' . $key,
"rightSlider" => 'right_slider_' . $key,
"tracker" => "drag_tracker_" . $key,
"trackerWrap" => "drag_track_" . $key,
"minInputId" => $arItem["VALUES"]["MIN"]["CONTROL_ID"],
"maxInputId" => $arItem["VALUES"]["MAX"]["CONTROL_ID"],
"minPrice" => $arItem["VALUES"]["MIN"]["VALUE"],
"maxPrice" => $arItem["VALUES"]["MAX"]["VALUE"],
"curMinPrice" => $arItem["VALUES"]["MIN"]["HTML_VALUE"],
"curMaxPrice" => $arItem["VALUES"]["MAX"]["HTML_VALUE"],
"fltMinPrice" => intval($arItem["VALUES"]["MIN"]["FILTERED_VALUE"]) ? $arItem["VALUES"]["MIN"]["FILTERED_VALUE"] : $arItem["VALUES"]["MIN"]["VALUE"],
"fltMaxPrice" => intval($arItem["VALUES"]["MAX"]["FILTERED_VALUE"]) ? $arItem["VALUES"]["MAX"]["FILTERED_VALUE"] : $arItem["VALUES"]["MAX"]["VALUE"],
"precision" => $precision,
"colorUnavailableActive" => 'colorUnavailableActive_' . $key,
"colorAvailableActive" => 'colorAvailableActive_' . $key,
"colorAvailableInactive" => 'colorAvailableInactive_' . $key,
);
  • Вопрос задан
  • 2633 просмотра
Решения вопроса 1
@PetrPo
Снова привет)
В шаблоне компонента фильтра в template.php в value ты правильно сделал, только round убери и добавь к инпутам соответствующие data параметры
data-price="<?=$arItem["VALUES"]["MIN"]["VALUE"];?>"
data-price="<?=$arItem["VALUES"]["MAX"]["VALUE"];?>"

Дальше в script.js
1. В самом начале в функцию function JCSmartFilter добавь
this.inputsPrice = {};

2. После этой функции добавь
JCSmartFilter.prototype.setInputsPrice = function() {
	if(!this.form)
		return;
	
	if(!Object.keys(this.inputsPrice).length) {
		var inputs = BX.findChildren(this.form, {'tag': new RegExp('^(input)$', 'i'), 'attribute': {'data-price': new RegExp('^(.*)$', 'i')}}, true);
		
		inputs.forEach(function(item, i) {
			this.inputsPrice[item.name] = item.dataset.price;
		}, this);
	}
}

3. Найди функцию JCSmartFilter.prototype.reload там есть проверка if (this.form) внутри нее добавь
this.setInputsPrice();

4. Найди функцию JCSmartFilter.prototype.values2post перед нее добавь функцию
JCSmartFilter.prototype.values = function(values) {
	values.forEach(function(item, i) {
		if(Object.keys(this.inputsPrice).indexOf(item.name) !== -1) {
			values[i].value = parseFloat(item.value) !== parseFloat(this.inputsPrice[item.name]) ? item.value : '';
		}
	}, this);
}

5. А внутри функции JCSmartFilter.prototype.values2post добавь
this.values(values);

6. Найди функцию SmartFilter.prototype.recountMinPrice в ней убери
if (newMinPrice != this.minPrice)
	this.minInput.value = newMinPrice;
else
	this.minInput.value = "";

оставь просто
this.minInput.value = newMinPrice;

7. Тоже самое с функцией SmartFilter.prototype.recountMaxPrice
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
alexyarik
@alexyarik
Битрикс разработчик
Сделайте режим AJAX только для фильтра catalog.smart.filter битрикс. Переопределение сделайте FORM_ACTION на свой
<script>
	var smartFilter = new JCSmartFilter('<?=CUtil::JSEscape($arResult['FORM_ACTION'])?>/ajax/catalog_smart_filter_ajax.php');
</script>
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы