Всем привет!
В интернет-магазине нужно сделать компонент фильтра товаров, учитывающего наличие установленных свойств у товаров подразделов. То есть, в отличие от стандартного фильтра, выводящего все поля, этот должен выводить только те, которые наличествуют хотя бы у одного товара в разделе. Плюс возможность вывода текстовых и числовых значений в виде списка. Ниже есть более-менее подробное описание задачи.
Жду предложений по цене/срокам с ссылками на примеры работы схожих компонентов, разработанных вами. Мы более года работали с отличным программистом, и теперь ищем на частичную занятость хорошего веб-программиста. Если вы заинтересованы в удаленной работе в объеме 10-20 часов в месяц, тем более имеет смысл откликнуться на этот топик. Задачи у нас есть всегда, оплата щедрая и регулярная.
[B][SIZE=3]Подробнее[/SIZE][/B]
Задача — сделать в каталоге товаров фильтр по свойствам и цене. Фильтр выводится на страницах разделов. При выводе полей для фильтрации нужно учитывать наличие свойств у товаров в разделе и его подразделах. Выводятся только те свойства, которые хотя бы единожды встречаются у товаров раздела и его подразделов. Фильтр должен быть выполнен по технологии ajax. При заполнении условий фильтрации должен динамически изменяться набор полей (и значений для типа "список") в соответствии с наличием свойств у отфильтрованного списка товаров, а на кнопке "Показать ... товаров" должно изменяться число найденных товаров. Обновление должно производиться по клику на ссылки (для типа "список") и для события input.onchange. Выводиться отобранные товары (с перезагрузкой страницы) должны по нажатию кнопки "Показать". При перезагрузке страницы для вывода товаров все выбранные поля фильтра должны быть заполнены текущими значениями.
[B]Представление: [/B]
* Свойства типа "строка" — текстовое поле;
* Свойства типа "число" — два поля для диапазона значений с подставленными минимальным и максимальным значениями либо шкала и два движка как в Яндекс.Маркете;
* Свойства типа "список" — в виде ссылок в одну строку, чтобы можно было выбрать несколько вариантов; клик по ссылке устанавливает отбор, повторный снимает.
[B]Особые условия: [/B]
* Список полей, которые будут выводиться в каждом разделе, должен храниться в метаданных раздела (в его свойствах или в отдельном инфоблоке) и изменяться при добавлении/изменении товаров, входящих в раздел и его подразделы, например, по событиям OnAfterIBlockElementAdd и OnAfterIBlockElementUpdate. Соответственно, при добавлении/изменении раздела должен переписываться и набор свойств для фильтрации.
* Все свойства кроме "Наличие" и "Срок поставки" добавляются и выгружаются только с помощью 1С, соответственно, набор свойств можно пересчитывать по окончанию выгрузки из 1С, если битрикс уже имплементировал такое событие (обещали уже давно). "Наличие" и "Срок поставки" рассчитываются скриптами на сайте, для обновления этих полей фильтра можно в код этих скриптов вставить вызов функции, обновляющей поля фильтров в разделах, которым принадлежит товар (его раздел и разделы выше по иерархии).
[B]Скрипт для проверки [/B]
В каждом разделе самого нижнего уровня (непосредственно в котором лежит товар) набор свойств всех товаров должен быть одинаковым. То есть, все товары, лежащие в одном разделе, должны быть однородными и обладать одинаковым набором свойств. (Как правило, и у раздела выше по иерархии набор свойств также может быть одинаковым, но это не всегда так, поэтому я пока не могу предложить однозначный алогоритм для проверки разделов выше.) Если у какого-то из товаров не установлено свойство, которое присутствует у других товаров раздела, значит, при заполнении свойств товара произошла человеческая ошибка. Нужен скрипт для выполнения по крону, который будет проходить по разделам, формировать набор свойств и проверять, все ли товары в разделе имеют одинаковый набор свойств. Если у товара не заполнено какое-либо свойство, должно формироваться письмо админу с указанием товара и незаполненного свойства.
[B]Заполнение полей фильтра[/B]
Фактически, для заполнения полей всех разделов, нужно всего лишь знать набор свойств входящих в них разделов самого нижнего уровня. То есть, пройдясь по разделам, не имеющим подразделов, и записав в их свойства набор полей для фильтрации с набором значений для типов "число" и "список", мы можем на основе этих данных заполнить все вышестоящие по иерархии разделы.
Чтобы не проходить по всем разделам, можно добавить специальное свойство-флаг, например, FILTER_FIELDS_SYNC и сбрасывать его при изменении любого товара, входящего в раздел. Отбираем разделы по свойству FILTER_FIELDS_SYNC == False, затем для каждого из отобранных разделов по SECTION_ID отбираем товары, составляем список свойств и значений, перезаписываем свойства раздела, отбираем стоящие выше разделы, составляем список полей и значений из нижестоящих разделов, перезаписываем, отбираем следующие вышестоящие, перезаписываем их и т.д., пока не дойдем до разделов, стоящих на самом верху иерархии.