Сложный фильтр для каталога товаров

#
Сложный фильтр для каталога товаров
Есть каталог запчастей. У товаров есть несколько свойств (модели, марки машин, номер двигателя и т.д.). Задача фильтровать список моделей по значениям этих свойств. Причем делать это нужно не на уровне xsl, а на уровне запроса к базе. Пошерстив форум, я нашел, что это делается через external_properties. Но что-то так ничего и не вышло фильтровать. Потом нашел способ через param['select']. Получилось такое:

$keys = array_keys($_GET);
        foreach ($keys as $key) {
            if (preg_match("/property_id_/", $key)) {
                $element = array();
                $element['type'] = 1; // 0 - основное св-во, 1 - дополнительное
                $element['property_id'] = str_replace("property_id_", "", $key);
                $element['prefix'] = ' AND '; // префикс
                $element['if'] = '='; // Условие
                $element['value'] = $_GET[$key];
                $element['sufix'] = '';
                $param['select'][] = $element;
                //$external_propertys[$key] = $element['value'];
            }
        }

Ну т.е. суть проста, берем все, что через property_id_XX передается и пытаемся составить фильтр. Это работает, если только одно свойство задано, а вот как сделать, чтобы соединить результаты фильтрации по нескольким признакам, я так и не понял. Заранее благодарю.
Модератор
#
Re: Сложный фильтр для каталога товаров
mininzidane писал(а):
Пошерстив форум, я нашел, что это делается через external_properties.

Это утверждение неверно.
mininzidane писал(а):
Это работает, если только одно свойство задано, а вот как сделать, чтобы соединить результаты фильтрации по нескольким признакам, я так и не понял. Заранее благодарю.

Вам нужно использовать "HAVING COUNT ..." по количеству разных свойств.
http://hostcms.ru/forums/17/4405/
http://hostcms.ru/forums/17/2887/
#
Re: Сложный фильтр для каталога товаров
HostCMS, посмотрел темы по ссылкам, которые Вы дали. У меня получилось сделать фильтр по логике "ИЛИ":

$element = array();
        $element['type'] = 1;
        $element['prefix'] = ' AND ';//(
        $element['property_id'] = 28;
        $element['if'] = '=';
        $element['value'] = "поршень";
        $element['sufix'] = '';
        $param['select'][] = $element;

        $element['type'] = 1;
        $element['prefix'] = ' OR ';
        $element['property_id'] = 24;
        $element['if'] = '=';
        $element['value'] = "F22B";

        $count_condition = 2;
        $having_count = ' HAVING COUNT(shop_item_properties.property_id)= ' . $count_condition;
        $element['sql_having'] = $having_count;

        $param['select'][] = $element;
        $shop->ShowShop($current_shop_id, $xsl_catalog, $param, $external_propertys);


При этом наличие HAVING COUNT никак не влияет на результат. Проблема в том, что мне нужен фильтр "И". Пытался использовать вот такой код:

$element = array();
        $element['type'] = 1;
        $element['prefix'] = ' AND ';//(
        $element['property_id'] = 28;
        $element['if'] = '=';
        $element['value'] = "поршень";
        $element['sufix'] = '';
        $param['select'][] = $element;

        $element['type'] = 1;
        $element['prefix'] = ' AND ';
        $element['property_id'] = 24;
        $element['if'] = '=';
        $element['value'] = "F22B";

        $count_condition = 2;
        $having_count = ' HAVING COUNT(shop_item_properties.property_id)= ' . $count_condition;
        $element['sql_having'] = $having_count;

        $param['select'][] = $element;
        $shop->ShowShop($current_shop_id, $xsl_catalog, $param, $external_propertys);

И всегда получаю пустой результат. Естественно, данные я проверил - должны быть строки, удовлетворяющие условиям.
До обновления до 6 версии уже был реализован фильтр и он прекрасно работал. Но после обновления именно фильтр перестал работать. Может быть это связано с изменением структуры БД
Авторизация