Свободный вечер пятницы и жажда креатива заставили меня сделать дополнительное пользовательское свойство для инфоблоков – чекбокс.
Традиционно, хардкорные программисты реализуют функционал чекбокса с помощью строки, где хранится значение Y/N, или с помощью числа 0/1. Интеграторы со стажем используют свойство список с единственным элементом.
Первый подход мне не нравится, потому что он не юзер-ориентирован, а второй мне кажется слишком тяжеловесным. А еще хотелось бы работать с этим свойством как с полем "ACTIVE". Поэтому я решил сделать своё свойство с... ну вы знаете с чем [spoiler] Следующий код надо положить в какой-нибудь файл и заинклюдить его в init.php. Всё остальное он сделает сам.
По сути моё свойство – это обёртка над строкой, в базе оно сохраняется как "Y" и "N". Соответственно, для фильтрации через API надо использовать эти значения. Кроме того, везде, где можно, любые значения отличные от "Y" считаются за "N".
Если разрешить поиск по этому свойству, то в индекс попадёт название свойства, а не значение. Ну действительно, зачем кому-то искать по букве "Y" ? Так что, если мы назовём свойство «горячее предложение», то в поиске по этой фразе найдутся все элементы, у которых установлен соответствующий флажок.
Проблемы
Фильтр в публичной части выглядит, как текстовый инпут. В штатных свойствах «Дата/Время» и «Счетчик» можно подглядеть метод GetPublicFilterHTML, который, по-видимому, должен отвечать за внешний вид фильтров в публичке, однако Битрикс его нигде не использует, а жаль.
Мне не захотелось оборачивать одно единственное свойство в модуль, потому что я не сторонник теории 1001 мелкого модуля. По этой причине свойство не удастся использовать на сайте с несколькими языками (хотя все языковые фразы я вынес в отдельный массив). Если кто-то задумает собрать модуль с пользовательскими свойствами, то я буду только рад, если моё творенье окажется там
Не вижу смысла извращаться. Для фильтра да/нет достаточно поле "Список" с видом "Флажки". Отмечен - да, не отмечен - нет. "!PROPERTY_YOURCODE"=>false и "PROPERTY_YOURCODE"=>false и никаких лишних JOIN-ов
Индекс по полю с двумя уникальными значениями вполне может быть эффективным, если необходима выборка одного из состояний, которое значительно более редко чем противоположное. Как пример Новости которые надо выделить как горячие на главной странице портала.
Следующий код надо положить в какой-нибудь файл и заинклюдить его в init.php. Всё остальное он сделает сам.
Может я что то неправильно сделал, или не так понял. Как проверить результат? Что и где должно измениться? Я смотрел в типах свойств инфоблока. Я еще новичок, так что не судите сторго.
Вроде бы всё верно. Если заинклюдить этот файл в init.php, то в настройках инфоблоков появится новый тип свойства, который называется "Флажок". Дальше его можно использовать как любые другие типы свойств.
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».