Ленивый программист и многообразие свойств инфоблока Битрикс

  • Ленивый программист и многообразие свойств инфоблока Битрикс

    Антон Долганин 14 Декабря 2015 10:03 11581
    Всем известна поговорка «Хороший программист — ленивый программист». Суть в том, что вместо того чтобы сгоряча бросаться на задачу, лучше посидеть подумать. Разберем на примере эту поговорку.

    Итак, сначала задача. Определенное св-во в списке элементов показывать только в определенном периоде дат. Вроде бы просто,  но на деле получаем, что нам для каждого выводимого элемента нужно сверять довольно тяжелое свойство дата-время с текущим временем. Это удар по производительности.

    Вариант следующий.  Обходить периодически прокисшие элементы и грохать там свойство. Вариант, но мы теряем накопленные данные. Может и не критично, но не очень хорошо.

    Еще вариант, хранить в доп. свойстве таймстамп сохраняемой даты. Но тут снова проблема — занимаем +1 свойство в инфоблоке, которые не бесконечны, а так же опять лень — это же обработчик писать! :)

    Думаем. А что если взять штатное свойство дата-время и просто его изменить? Хранить не как дату, а как таймстамп? Идея!

    2015-12-14_13-04.png

    Но блин, это же целый тип свойства городить, скажете вы? А вот и нет, мы берем и наследуемся от родительского типа дата-время :)

    2015-12-14_13-10.png

    Эврика! То, что мы и хотели — быстрая работа при выводе — это обычный таймстамп теперь, и старые добрые интерфейсы для редактора. А по коду мы просто переопределили сохранение.

    Я не хотел этим постом рассказать о супер-свойстве, это вообще очень частная задача была рассмотрена, я хотел показать подход к решению задач вкупе с высокой производительностью вашего проекта. Но вместе с тем — вот полный листинг типа свойства http://bxapi.ru/code/UYj14KGAaXphEbw/
Алексей
14 Декабря 2015 10:30
Сохранил.
Владимир
14 Декабря 2015 11:25
Спасибо, хорошый вариант
Олег
14 Декабря 2015 17:30
Что за пояснения в вашем коде про VALUE и DESCRIPTION - вроде бы нигде не используется...


Почему так?
if (strlen($arValue['VALUE']))


А не так:
if ($arValue['VALUE'])


Или так:
if (is_string($arValue['VALUE']))


Вроде, пост о производительности, но здесь заставляем вычислять длину строки.
Поясните пожалуйста, я не понял.
Антон Долганин
15 Декабря 2015 5:07
Что за пояснения в вашем коде про VALUE и DESCRIPTION - вроде бы нигде не используется...
Это для других методов, сюда не вошли.

Почему так?
1. Привычка.
2. Это идет сохранение в базу, что возможно только в админке (в моем случае), поэтому тут роли не играет.
Василий
13 Апреля 2017 14:01
Антон, подскажите как так же скопировать тип "Список". По аналогии у меня не получается, может что-то есть особенное в списках?
Антон Долганин
13 Апреля 2017 19:58
Василий, да, там сложнее. Так как наследование от списка идет. Прикрепляю болванку с описанием класса наследника св-в. Там все понятно думаю.
Файлы:
iblocktypecheckbox.php (14.49 КБ)
Василий
14 Апреля 2017 10:50
Получается, чтобы кастомизировать шаблон вывода стандартного свойства "Список", мне нужно городить полностью новый класс для пользовательского нового свойства "Мой список". Я думал можно скопировать стандартный и поменять метод GetPropertyFieldHtml.