Хоть и устарела 5-ка, но может кому пригодится.
На новом проекте решил сделать показ старых товаров (чтоб в каталоге не показывались, а карточка товара висела).
Решение уже пройденное, т.к. в одном из магазинов работает. Как описано выше берем и вставляем в динамическую страницу код:
$element['type'] = 0; // 0 - основное св-во, 1 - дополнительное
$element['prefix'] = ' AND ';
$element['name'] = 'shop_items_catalog_rest';
$element['if'] = '>';
$element['value'] = '-2'; // так мне нужно (0 - это товар под резервом. -1 - на заказ)
$element['sufix'] = '';
$param['select'][] = $element;
Все работает (товары -2 не показывает), но при выборе дополнительных фильтров начинается бред (до этого все работало). Ощущение что один из фильтров не накладывается, а другой стал через чур жадный.
Думаю от чего такой прикол, на другом же все работает да и в коде особой разницы нет. Потихоньку начинаю понимать, что дело в складе. В новом проекте склада 2. Вроде писали, что никаких проблем, а нет есть.
Делаю в запросе ошибку, может есть проще способ в api лень было искать.
Получаю следующее:
SELECT SQL_CALC_FOUND_ROWS DISTINCT
shop_items_catalog_table.shop_items_catalog_item_id ,
SUM(shop_warehouse_items_table.shop_warehouse_items_count) as
`shop_items_catalog_rest` FROM shop_items_catalog_table
LEFT JOIN
shop_list_of_properties_table ON
shop_items_catalog_table.shop_shops_id =
shop_list_of_properties_table.shop_shops_id
LEFT JOIN shop_properties_items_table
ON shop_items_catalog_table.shop_items_catalog_item_id = shop_properties_items_table.shop_items_catalog_item_id
AND shop_properties_items_table.shop_list_of_properties_id = shop_list_of_properties_table.shop_list_of_properties_id
LEFT JOIN `shop_warehouse_items_table` ON shop_warehouse_items_table.shop_items_catalog_item_id=shop_items_catalog_table.shop_items_catalog_item_id
WHERE shop_items_catalog_table.shop_items_catalog_is_active = '1'
AND shop_items_catalog_table.shop_items_catalog_modification_id = '0'
AND shop_items_catalog_table.shop_items_catalog_access IN(0,-1)
AND shop_items_catalog_table.shop_shops_id='1'
AND shop_items_catalog_table.shop_groups_id = '597'
AND (shop_items_catalog_table.shop_items_catalog_putend_date >= '2013-10-01 00:46:11' OR shop_items_catalog_table.shop_items_catalog_putend_date ='0000-00-00 00:00:00')
AND shop_items_catalog_table.shop_items_catalog_putoff_date <= '2013-10-01 00:46:11'
AND shop_producers_list_id = '74'
AND (shop_list_of_properties_table.shop_list_of_properties_id=136 AND shop_properties_items_table.shop_properties_items_value = '101' OR
shop_list_of_properties_table.shop_list_of_properties_id=134 AND shop_properties_items_table.shop_properties_items_value = '84' )
GROUP BY shop_items_catalog_table.shop_items_catalog_item_id
HAVING COUNT(shop_properties_items_table.shop_properties_items_id) =2 AND `shop_items_catalog_rest` > -2
ORDER BY shop_items_catalog_table.shop_items_catalog_order Asc, shop_items_catalog_table.shop_items_catalog_name Asc LIMIT 0, 10
Тут у меня затуп случился, вижу что косяк из-за подключения таблицы складов но почему не могу понять. Тут я решил написать в поддержку. Но то ли излагать не умею, то ли в поддержке денег не платят.
Но после 2 ответа от саппорта я понимаю, что они мне не помогут. Так и сказали: анализируйте запросы и ищите причину.
Анализ показал, что проблема в том, что 2 склад увеличивает выборку в 2 раза и это надо учитывать когда мы пишем в sql
HAVING COUNT(shop_properties_items_table.shop_properties_items_id) =2
2 - это это количество подходящих условий у товара вот тут они:
AND (shop_list_of_properties_table.shop_list_of_properties_id=136 AND shop_properties_items_table.shop_properties_items_value = '101' OR
shop_list_of_properties_table.shop_list_of_properties_id=134 AND shop_properties_items_table.shop_properties_items_value = '84' )
Поэтому строк уже не 2, а 2 раза больше т.е. 4
Так это в тип. дин. стр.
....................
if ($count_condition != 0)
{
$param['sql_group_by'] = 'GROUP BY shop_items_catalog_table.shop_items_catalog_item_id';
$param['sql_having'] = 'HAVING COUNT(shop_properties_items_table.shop_properties_items_id) = '.$count_condition * 2; // тут я дописал 2ку, хотя нужно количество складов для товара
}
else
{
$param['sql_having'] = 'HAVING 1 ';
}
$element['sufix'] = ' ) ';
........
Почти все, но тот же запроос показал что товара у меня на складе не -2, а -4 если фильтров 2шт. подправил код
$element['type'] = 0;
$element['prefix'] = 'AND';
$element['name'] = 'shop_items_catalog_rest';
$element['if'] = '>';
$element['value'] = ($count_condition != 0) ? $count_condition * -2 : -2;
$element['sufix'] = '';
$param['select'][] = $element;
Более изящное решение буду рад увидеть. Может все можно гораздо проще.