Телеграм: @camouf_ru Почта: mihail@bazarow.ru

Select  вместо chekbox в умном фильтре 1С-битрикс

Рассмотрим как можно сделать выпадающий список свойств в умном фильтре Битрикс, вместо стандартного chekbox. Нужно это дастаточно редко однако случается.

 

В начале было вот так:

 

Станет вот так:

select  вместо chekbox

Для начала копируем шаблон стандартного smart.filter в папку со своим шаблоном сайта и подключаем его в шаблоне комплексного компонента каталога, заменив соответствующую строку в файле section.php.

 

Далее открываете шаблон компонента умного фильтра smart.filter . Для этого заходите в свой шаблон, например, /bitrix/templates/.default/components/bitrix/catalog.smart.fitr/myfilter и изменяете следующие файлы:

 

В файле script.js изменяете 2 метода click и reload:
Метод clickSelect() на этот :

JCSmartFilter.prototype.clickSelect = function(select)
{
if(this.timer)
clearTimeout(this.timer);
this.timer = setTimeout(BX.delegate(function(){
this.reloadSelect(select);
}, this), 1000);
}

Метод Метод reloadSelect():

JCSmartFilter.prototype.reloadSelect = function(select)
{
this.position = BX.pos(select, true);
this.form = BX.findParent(select, {'tag':'form'});
if(this.form)
{
var values = new Array;
values[0] = {name: 'ajax', value: 'y'};
this.gatherInputsValues(values, BX.findChildren(this.form, {'tag':'select'}, true));
BX.ajax.loadJSON(
this.ajaxURL,
this.values2post(values),
BX.delegate(this.postHandler, this)
);
}
}  

В файле template.php находим часть которая выводит инпуты с чекбоксами, примерно 147-я строка и полностью заменяем на:

<div>
<select id="<?=$arItem['CODE']; ?>" name="" onChange="smartFilter.clickSelect(this)" >
<option id="not-value" value="" >- - - -</option>
<?foreach($arItem["VALUES"] as $val => $ar) { ?>
<option <?echo $ar["CHECKED"]? 'selected="selected"': ''?> id="<?echo $ar["CONTROL_NAME"]?>" <?if ($ar["DISABLED"]){ ?>disabled<? } ?> value="Y" ><?echo $ar["VALUE"];?></option>
<? } //end foreach property values ?>
</select>
</div>

И в самый конец template.php вставляем скрипт который поможет стандартному AJAX  понять какие параметры ему предаются.  Для каждого списка обработчик свой:

<script>
$(document).ready(function(){
<? //Формируем дополнительные jquery обработчики для select-ов
foreach($arResult["ITEMS"] as $key=>$arItem) {
if(!empty($arItem["VALUES"]) && !isset($arItem["PRICE"])) {
?>
//Проставляем name select-ам с уже выбранными свойствами
setTimeout(function(){
var SelectOption = $("#<?=$arItem['CODE']; ?> option:selected").attr('id');
$("#<?=$arItem['CODE']; ?>").attr('name',SelectOption);
},1500);
//заполнение name с реакцией на change
$("#<?=$arItem['CODE']; ?>").on('change', function(){
var SelectOption = $("#<?=$arItem['CODE']; ?> option:selected").attr('id');
$("#<?=$arItem['CODE']; ?>").attr('name',SelectOption);
});
<?
}
}?>
});
</script>

В общем-то все, стилизовать внешний вид вы всегда сможете под себя. Написано на основе нескольких тем на форуме http://dev.1c-bitrix.ru/community/forums/

Просмотров: 11924 | Комментариев: 14

Комментарии

Внимание! все сообщения проходят премодерацию. Ваше сообщение появится после проверки
 
Текст сообщения*
Перетащите файлы
Ничего не найдено
Защита от автоматических сообщений
Загрузить файл
Нажимая кнопку "Отправить", Вы принимаете условия
Политики конфиденциальности и обработки персональных данных
Игорь
к сожалению не работает :(
Имя Цитировать
Михаил Базаров
Цитата
Игорь пишет:
к сожалению не работает
Только что проверил- все работает, в тексте опечаток нет
Имя Цитировать
Дмитрий
Спасибо!
Имя Цитировать
Валентин
Доброго времени суток! Все сделал как Вы написали! Но вышла нехорошая штука: при добавлении компонента  в select  ниже появляется дополнительный select. В итоге у меня на одно свойство имеются два селекта с одинаковыми компонентами. Как быть??? Заранее очень благодарен!
Имя Цитировать
Guest
Добрый день!
Есть ли способ переделать поля аналогично в input?
Имя Цитировать
Михаил Базаров
Цитата
Guest пишет:
Добрый день!
Есть ли способ переделать поля аналогично в input?
Пока не приходилось сталкиваться с такой задачкой. но чем-то сверхсложным быть не должно.
Имя Цитировать
Guest
Спасибо за инфу, хотелось бы увидеть урок по переносу умного фильтра на главную страницу
Имя Цитировать
Михаил Базаров
Цитата
Guest пишет:
Спасибо за инфу, хотелось бы увидеть урок по переносу умного фильтра на главную страницу
Умный фильтр работает только когда находится перед компанентом catalog.section сам по себе он не действует. Что бы вывести на главную надо работать с обычным "тупым" фильтром
Имя Цитировать
Марина
Добрый день!

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

Буду признательна за ответ: можно ли штатными средствами Bitrix Управление сайтом сделать такую выборку по товарам. Если нет, то каким образом не штатными внутри системы?

http://www.inwool.de/alpakadecken

Спасибо.
Имя Цитировать
Александр Христич
Михаил, здравствуйте!
Не работает умный фильтр для не авторизованных пользователей, как это можно исправить?
Имя Цитировать
Александр Си
Здравствуйте Михаил! Вопрос немножко не по ветке ваших тем, но хотелось бы получить совет от грамотного специалиста.

Вопрос в том, что сейчас на стандартной сборке Битрикс Малый Бизнес есть необходимость видоизменить умный фильтр под свои нужды, а именно: изменить шаблон вывода параметров, версткой бутстрап в 4 колонки и в определенной очередности. Но открыв программный код поняли, что видимо все параметры дополнительные свои созданные выводятся не отдельным кодом на каждый параметр, а общим, а в шаблоне соответственно необходимо разделить свойства отдельными столбцами, и вообще изменить общий дизайн всего фильтра, кардинально. Возможно ли реализовать это и что бы вы посоветовали сделать в данном случае?
Имя Цитировать
Михаил Базаров
Цитата
Александр Си написал:
Здравствуйте Михаил! Вопрос немножко не по ветке ваших тем, но хотелось бы получить совет от грамотного специалиста.

Вопрос в том, что сейчас на стандартной сборке Битрикс Малый Бизнес есть необходимость видоизменить умный фильтр под свои нужды, а именно: изменить шаблон вывода параметров, версткой бутстрап в 4 колонки и в определенной очередности. Но открыв программный код поняли, что видимо все параметры дополнительные свои созданные выводятся не отдельным кодом на каждый параметр, а общим, а в шаблоне соответственно необходимо разделить свойства отдельными столбцами, и вообще изменить общий дизайн всего фильтра, кардинально. Возможно ли реализовать это и что бы вы посоветовали сделать в данном случае?
Там, по большому счету, все параметры (их вид точнее), обвернуты в case-ы
Можете просто разобрать их на более гибкие if-ы
Да, листинг будет просто огромный. Но зато поубираете не нужные case-ы. За счет этого, немного подсократите.

Само собой, это стоит делать, если реально нужно переделать шаблон фильтра- "под орех"
В целом, отвечая на вопрос: Да, с шаблоном фильтра можно сотворить что угодно.
Имя Цитировать
Александр Си
Цитата
Михаил Базаров пишет:
Там, по большому счету, все параметры (их вид точнее), обвернуты в case-ы
Можете просто разобрать их на более гибкие if-ы
Да, листинг будет просто огромный. Но зато поубираете не нужные case-ы. За счет этого, немного подсократите.

Само собой, это стоит делать, если реально нужно переделать шаблон фильтра- "под орех"
В целом, отвечая на вопрос: Да, с шаблоном фильтра можно сотворить что угодно.
С этим моментом поняли, но пока не сообразим как правильнее сделать, у нас требуется расположить горизонтально фильтр, как на примере:
http://prntscr.com/l5q2px
Конструкция по верстке:

  •        <select>
                <option label="Хиты продаж" value="1" selected>
                       <span class="active">Хиты продаж</span>
                 </option>
                 <option>
                     <span>Да</span>
                   </option>
                   <option>
                      <span>Нет</span>
                   </option>
             </select>
       
То есть каждое свойство фильтра это селект со значением, и тут ряд проблемок, во первых каким образом в виде цикла раскидать каждое свойство в отдельный селект (у нас 2 типа - первый открывает ниже окно с диапазоном цен, а второй тип это селекты со значением в выпадающем списке).
В чем сложности:
http://prntscr.com/l5q3yv
Свойство по клике на которое открывается значение, при клике на которое открывается список, вот необходимо чтобы была главная ссылка, при клике на которую сразу бы выпадали значения (причем хорошо бы, чтобы значения Все не было вообще в списке).
И соответственно как вообще фильтр сделать в одну строку и распределить свойства как бы отдельным li друг от друга.
кейсы мы сократили до выпадающего списка и чекбоксов, ну и диапазон цен: http://prntscr.com/l5q5kn
Имя Цитировать
a13z2005@yandex.ru
Михаил Базаров подскажите  - как в этом селекте реализовать выбор нескольких значений?
Имя Цитировать
Михаил Базаров
Цитата
a13z2005@yandex.ru написал:
Михаил Базаров  подскажите  - как в этом селекте реализовать выбор нескольких значений?
Заметка уже староватая. В штатном фильтре должна быть такая возможность- если память не изменяет.
Если нет, можно переделать чекбоксы- нужно будет плотненько поверстать и попотеть- но сымитировать такую возможность через них
Имя Цитировать
Поделиться страницей Спасибо, это помогает развивать сайт.
Мой youtube канал. Сюда я выкладываю видео уроки по разработке сайтов и не только. Подписывайтесь, скоро будет серия свежих видео-инструкций:
Перейти на канал
Заметки разработчика

Примерно с 2013-го года пишу, короткие и не очень, заметки по разработке сайтов на Битрикс. Возможно, будут полезны кому-то еще. Во всех заметках есть возможность комментирования и обсуждения. Вы можете задавать уточняющие вопросы прямо там- отвечаю или дополняю заметки по возможности.

Заказaть разработку attention