Re: Наибольшее и наименьшее значение свойств товаров
Надо в коде ТДС "ИМ":
1. по имеющемуся ID текущей группы получить все дерево ее подгрупп - Тут вам помогут метод api класса shop, и функция SetGroups, которая есть в коде ТДС "ИМ". (желательно еще при этом проверить их на активность/неактивность, чтобы не учитывать потом товары из неактивных групп но для этого функцию SetGroups нужно изменить, добавив проверку активности каждой рассматриваемой группы. !это увеличивает нагрузку! но зачастую бывает просто необходимым.)
В результате вы должны получить "плоский" массив из идентификаторов всех ее подгрупп текущей группы.
Впрочем, нам может захотеться и иного - например выключить в выборку групп идентификатор текущей (что элементарно), или выключить в нее только непосредственные подгруппы, не залезая глубже по дереву подгрупп.
2. этот массив нужно имплодить в строку с разделителем "запятая", и написать SQL-запрос, делающий выборку идентификаторов всех товаров, находящихся в указанных группах - тут вам в помощь, во1х, SQL-оператор IN (), во2х, желательно учесть все стандартные условия, которые налагаются в HostCMS на выборки товаров - активность товара, даты публикации/распубликации, право доступа к товару текущим пользователем; по id магазина условие можно не накладывать, т.к. условие отбора по id групп будет его дублировать, только еще более строго. Пример штатного запроса можно увидеть в моем коде, в теме поиска товаров в редакции Халява - оттуда подойдет все, кроме последней строки с оператором LIKE. Ограничение по id магазина надо заменить на ограничение по id группы, (при чем нужно сохранить его первым - это маленькая оптимизация запроса )
Нам еще может захотеться учитывать только те товары, которые есть в наличии - тогда нужно будет в запросе джойнить таблицу складов, и накладывать пост-условие having.
3. Выполнив получившийся запрос, мы в конечном итоге получим плоский массив с id всех товаров, лежащих во всех подгруппах данной группы.
4. А дальше его нужно имплодить, опять же, в строку, и с ее помощью можно писать уже любые запросы на минимальные/максимальные значения чего бы то ни было. То есть используете эту строку идентификаторов товаров внутри оператора IN в условиях запросов, выбираете при этом сортировку результатов по нужному параметру и устанавливаете limit вывода результатов в одну строку - так вы получаете одно крайнее значение параметра в выборке.
5. Это все общая теория, а на практике может быть очень много различных вариантов.
Так, для минимальной и максимальной цены нужно учитывать еще тот нюанс, что цены у разных товаров могут быть заданы в разных валютах, и сравнивать просто их числовые значения нельзя, нужно приводить их к одной базовой валюте. (нужный код можно подсмотреть в коде ТДС ИМ, это такой кусок SQL-запроса с несколькими операторами IF, очень заметный). Кроме того, может захотеться при этом учитывать и действующие скидки на цену товаров, а это потянет за собой джойн с другими таблицами.
А для мин-макс значений доп.свойств нужно, во1х, джойнить таблицу товаров с таблицей доп.свойств и таблицей значений доп.свойств, и учитывать тип доп.свойства - например бессмысленно делать эту операцию для доп.свойства типа список, т.к. в таблице значений доп.свойств при этом хранятся только идентификаторы строк списков.
А вот, к примеру, для мин/макс веса вообще все просто, его можно сравнивать просто в виде цифр элементарным запросом
Таким образом, вариантов реализации подобных задач становится довольно много, и никакого универсального рецепта здесь быт не может. Поэтому конкретных примеров кода я приводить не буду - общей информации хватит чтобы понять принцип.
К тому же, в следующей версии HostCMS структура таблиц, вероятно, изменится, и конкретные примеры кода станут неактуальными.