фильтры по дополнительным свойствам товара

#
фильтры по дополнительным свойствам товара
итак, проблема следующая.
у товара имеются два дополнительных свойства: длина и ширина. необходимо добавить два фильтра, ограничивающие сверху по длине и ширине, отображаемый товар. Но после фильтрации результат абсолютно не поддается логическому объяснению.

в типовые динамические страницы -> интернет магазин был добавлен следующий код:
/* Ограничиваем по длине ДО */
      if (to_float($_GET['length']) > 0)
      {
         $element['type'] = 1; // 0 - основное св-во, 1 - дополнительное
                        $element['name'] = '';
         $element['prefix'] = 'and'; // префикс
         $element['property_id'] = 4;
         $element['if'] = '<='; // Условие
         $element['value'] = to_float($_GET['length']);
         $element['sufix'] = '';
         $param['select'][] = $element;
         $external_propertys['length'] = to_float($_GET['length']);
         $external_propertys['apply_filter'] = true;
                        $element['property_id'] ='';
      }

/* Ограничиваем по ширине ДО */
      if (to_float($_GET['width']) > 0)
      {
         $element['type'] = 1; // 0 - основное св-во, 1 - дополнительное
                        $element['name'] = '';
         $element['prefix'] = 'and'; // префикс
         $element['property_id'] = 5;
         $element['if'] = '<='; // Условие
         $element['value'] = to_float($_GET['width']);
         $element['sufix'] = '';
         $param['select'][] = $element;
         $external_propertys['width'] = to_float($_GET['width']);
         $external_propertys['apply_filter'] = true;
                        $element['property_id'] ='';
      }

после заполнения переменной $param(перед вызовом процедуры
$GLOBALS['shops']->ShowShop($current_shop_id, $xsl_catalog, $param, $external_propertys);)
, она имеет следующее значение:

Array (
       [current_group_id] => 10
       [select] => Array (
                          [0] => Array (
                                        [type] => 1
                                        [name] =>
                                        [prefix] => and
                                        [property_id] => 4
                                        [if] => <=
                                        [value] => 150
                                        [sufix] =>
                                       )
                          [1] => Array (
                                        [type] => 1
                                        [name] =>
                                        [prefix] => and
                                        [property_id] => 5
                                        [if] => <=
                                        [value] => 110
                                        [sufix] =>
                                       )
                          [2] => Array (
                                        [type] => 0
                                        [name] =>
                                        [prefix] => and (
                                        [property_id] =>
                                        [if] =>
                                        [value] =>
                                        [sufix] =>
                                       )
                          [3] => Array (
                                        [type] => 0
                                        [name] =>
                                        [prefix] => 1
                                        [property_id] =>
                                        [if] =>
                                        [value] =>
                                        [sufix] => ) GROUP BY shop_items_catalog_table.shop_items_catalog_item_id ) )
       [items_begin] => 0
      )
Модератор
#
Re: фильтры по дополнительным свойствам товара
Данная проблема решается следующим образом:

// Ограничиваем по длине ДО

$element['type'] = 0;
$element['prefix'] = ' AND ';
$element['name'] = 'information_items_table.information_blocks_id';
$element['if'] = '=';
$element['value'] = '<Идентификатор инфосистемы>';
$element['sufix' ] = " AND
information_propertys_table.information_propertys_id = '4' AND  
CONVERT(information_propertys_items_table.information_propertys_items_value, UNSIGNED)<= ".to_float($_GET['length']);
$param['select'][] = $element;


// Ограничиваем по ширине ДО

$element['type'] = 0;
$element['prefix'] = ' AND ';
$element['name'] = 'information_items_table.information_blocks_id';
$element['if'] = '=';
$element['value'] = '<Идентификатор инфосистемы>';
$element['sufix' ] = " AND
information_propertys_table.information_propertys_id = '5' AND
CONVERT(information_propertys_items_table.information_propertys_items_value, UNSIGNED)<= ".to_float($_GET['width']);
$param['select'][] = $element;
#
Re: фильтры по дополнительным свойствам товара
Ваше решение проблемы относится не к моему вопросу.
Мой вопрос о товарах хранящихся в магазине а не в инфосистеме. Но направление в котором копатья понял и нашел вот такое решение

/* Ограничиваем по длине ДО */
      if (to_float($_GET['length']) > 0)
      {
         $element['type'] = 0;
                        $element['prefix'] = ' and ';
                        $element['name'] = 'shop_properties_items_table.shop_list_of_properties_id';
                        $element['if'] = ' = ';
                        $element['value'] = 4;
                        $element['sufix' ] = " AND  
CONVERT(shop_properties_items_table.shop_properties_items_value, UNSIGNED)<= ".to_float($_GET['length']);
         $param['select'][] = $element;
         $external_propertys['length'] = to_float($_GET['length']);
         $external_propertys['apply_filter'] = true;
      }

/* Ограничиваем по ширине ДО */
      if (to_float($_GET['width']) > 0)
      {
         $element['type'] = 0;
                        $element['prefix'] = ' and ';
                        $element['name'] = 'shop_properties_items_table.shop_list_of_properties_id';
                        $element['if'] = ' = ';
                        $element['value'] = 5;
                        $element['sufix' ] = " AND  
CONVERT(shop_properties_items_table.shop_properties_items_value, UNSIGNED)<= ".to_float($_GET['width']);
         $param['select'][] = $element;
         $external_propertys['width'] = to_float($_GET['width']);
         $external_propertys['apply_filter'] = true;
      }

но как видно эти фильтры работают поотдельности, а совместно они ничего не дают(это очевидно).

Скажите, все-таки как заставить их работать вместе.

заранее спасибо за помошь!
Модератор
#
Re: фильтры по дополнительным свойствам товара
onixpro,
принцип работы у ИС и магазина весьма схожи, только имена таблиц и полей сменить
#
Re: фильтры по дополнительным свойствам товара
да я так и сделал, в предыдущем сообщении написан код.
поотдельности фильтры работают, но СОВМЕСТНО НЕ РАБОТАЮТ.
Это видно из sql-запроса.
Вопрос такой, как заставить их работать вместе?????
Модератор
#
Re: фильтры по дополнительным свойствам товара
Вы неправильно внесли изменения в конструкцию, которую я приводил выше. Для интернет-магазина она будет выглядеть следующим образом:

// Ограничиваем по длине ДО

$element['type'] = 0;
$element['prefix'] = ' AND ';
// Вместо поля идентификатора информационной системы подставляем поле идентификатора магазина
$element['name'] = 'shop_items_catalog_table.shop_shops_id';
$element['if'] = '=';
// Вместо <Идентификатор магазина> подставляем идентификатор магазина
$element['value'] = '<Идентификатор магазина>';
$element['sufix' ] = " AND
shop_list_of_properties_table.shop_list_of_properties_id = '4' AND  
CONVERT(shop_properties_items_table.shop_properties_items_value, UNSIGNED)<= ".to_float($_GET['length']);
$param['select'][] = $element;


// Ограничиваем по ширине ДО

$element['type'] = 0;
$element['prefix'] = ' AND ';
// Вместо поля идентификатора информационной системы подставляем поле идентификатора магазина
$element['name'] = 'shop_items_catalog_table.shop_shops_id';
$element['if'] = '=';
$element['value'] = '<Идентификатор магазина>';
$element['sufix' ] = " AND
shop_list_of_properties_table.shop_list_of_properties_id = '5' AND
CONVERT(shop_properties_items_table.shop_properties_items_value, UNSIGNED)<= ".to_float($_GET['width']);
$param['select'][] = $element;
#
Re: фильтры по дополнительным свойствам товара
0)мой код дает тот же результат тк магазин у меня всего 1.
1)но для проверки сделал так как вы предложили, все тоже самое фильтры поотдельности работают, а вместе нет
2)посмотрите на sql-запрос который получается, shop_list_of_properties_table.shop_list_of_properties_id = '4' AND  ... AND shop_list_of_properties_table.shop_list_of_properties_id = '5'
понятное дело на такой запрос ответ будет пустой.
Для достижения того чтобы 2 фильтра работали совместно, необходимо соединение с таблицей shop_list_of_properties_table дважды

ИТАК  в третий раз спрашиваю:
"КАК СДЕЛАТЬ ТАК ЧТОБЫ ФИЛЬТРЫ РАБОТАЛИ ВМЕСТЕ????"

(те например, найти товар у которого длина <=100 и ширина <=45?)
Модератор
#
Re: фильтры по дополнительным свойствам товара
Попробуйте вот следующий вариант:

// Число условий
$count_condition = 0;

// Ограничиваем по длине ДО

$element['type'] = 0;
$element['prefix'] = ' AND ( ';
// Вместо поля идентификатора информационной системы подставляем поле идентификатора магазина
$element['name'] = 'shop_items_catalog_table.shop_shops_id';
$element['if'] = '=';
// Вместо <Идентификатор магазина> подставляем идентификатор магазина
$element['value'] = '<Идентификатор магазина>';
$element['sufix' ] = " AND
shop_list_of_properties_table.shop_list_of_properties_id = '4' AND  
CONVERT(shop_properties_items_table.shop_properties_items_value, UNSIGNED)<= ".to_float($_GET['length']);
$param['select'][] = $element;
++$count_condition;


// Ограничиваем по ширине ДО

$element['type'] = 0;
if ($count_condition == 0)
{
     $element['prefix'] = ' AND (';
}
else
{
     $element['prefix'] = ' OR ';

}
// Вместо поля идентификатора информационной системы подставляем поле идентификатора магазина
$element['name'] = 'shop_items_catalog_table.shop_shops_id';
$element['if'] = '=';
$element['value'] = '<Идентификатор магазина>';
$element['sufix' ] = " AND
shop_list_of_properties_table.shop_list_of_properties_id = '5' AND
CONVERT(shop_properties_items_table.shop_properties_items_value, UNSIGNED)<= ".to_float($_GET['width'])." ) ";
$param['select'][] = $element;
++$count_condition;


$element['type'] = 0;
$element['name'] = '';

if (to_int($_GET['length']) !=0 && to_int($_GET['width']) == 0)
{
$element['prefix'] = ')';
}

$element['if'] = '';
$element['value'] = '';
$having_count = 'GROUP BY shop_items_catalog_table.shop_items_catalog_item_id HAVING COUNT(shop_properties_items_table.shop_properties_items_id)= '.$count_condition.'  ';

$param['select'][] = $element;
Авторизация