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