Убрать в интернет-магазине товары которых нет в наличии

Модератор
#
Re: Убрать в интернет-магазине товары которых нет в наличии
AHCAP,

/hostcmsfiles/lib/
Вы только что начали читать предложение, чтение которого вы уже заканчиваете.
#
Re: Убрать в интернет-магазине товары которых нет в наличии
Здравствуйте!
Задача схожая: Выбрать из каждой группы по 1 товару, который есть в наличии
По одному товару из каждой группы выбрать получается (без учета наличия) с помощью
... IN (gr1, gr2 ...) ... GROUP BY shop_groups_id ...
.

Код тоже работает:

$element['type'] = 0;
$element['prefix'] = 'AND';
$element['name'] = 'shop_items_catalog_rest';
$element['if'] = '>';
$element['value'] = 0;
$element['sufix'] = '';
$param['select'][] = $element;


Однако, при этом нельзя изменить группировку в SQL-запросе:
... GROUP BY shop_items_catalog_table.shop_items_catalog_item_id ...
- добавляется автоматически, а параметр $param['sql_group_by'] - видимо, отключен в этом случае

Пробовал добавить в $param['sql_having']:
$param['sql_having'] = ", shop_items_catalog_table.shop_groups_id HAVING 1";

при этом запрос имеет вид:
... GROUP BY shop_items_catalog_table.shop_items_catalog_item_id, shop_items_catalog_table.shop_groups_id HAVING 1 ...
- но нужного эффекта нет, группировка "по группам" не происходит.

Пример запроса:

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`, shop_items_catalog_table.shop_groups_id
FROM shop_items_catalog_table  
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 IN  (588,726,729,727,728)   
AND shop_items_catalog_table.shop_shops_id = '1'  
GROUP BY shop_items_catalog_table.shop_items_catalog_item_id , shop_items_catalog_table.shop_groups_id
HAVING 1 AND `shop_items_catalog_rest` > '0' ORDER BY shop_items_catalog_marking Asc  LIMIT 0, 12


Надеюсь решение есть Спасибо!
Hello, World!
#
Re: Убрать в интернет-магазине товары которых нет в наличии
Если вдруг кто-то столкнется с такой же проблемой, то вот решение, подсказанное мне Натальей из техподдержки:
$element['type'] = 0;
$element['prefix'] = ' and ';
$element['name'] = 'shop_items_catalog_rest';
$element['if'] = '>=';
$element['value'] = 0;
$element['sufix'] = '';
$param['select'][] = $element;

$param['items_field_order'] = 'shop_items_catalog_rest';
$param['items_order'] = 'DESC';


я так понял, эта проблема появилась после ввода функционала СКЛАДЫ, так? и надо было сначала создать поле наличия и потом сортировать по нему или не так понимаю?
Делаю сайты на HostCMS! Подробнее по почте anton.yurzanov@gmail.com
#
Re: Убрать в интернет-магазине товары которых нет в наличии
Хоть и устарела 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;


Более изящное решение буду рад увидеть. Может все можно гораздо проще.

#
Re: Убрать в интернет-магазине товары которых нет в наличии
rigl писал(а):
Ощущение что один из фильтров не накладывается,  а другой стал через чур жадный.

rigl писал(а):
В новом проекте склада 2

Судя по всему, вы прописываете для товара количество -2 на обоих складах.
А в SQL-запросе есть строка
Цитата:
SUM(shop_warehouse_items_table.shop_warehouse_items_count) as `shop_items_catalog_rest`
которая рассчитывает итоговое количество товара на складах. И для данного товара мы получаем (-2)+(-2)=-4, что, в свою очередь, не дает выполняться условию
'shop_items_catalog_rest' > -2, которое вы описываете под словами
Цитата:
Решение уже пройденное, т.к. в одном из магазинов работает.
.

Введенная вами зависимость shop_items_catalog_rest от $count_condition не верна. То есть она у вас работает, но как частный случай. Переменная $count_condition описывает общее число доп.свойств, по которым происходит фильтрация. Если вы будете фильтровать по бОльшему чем 2 кол-ву доп.свойств то нижняя граница остатка в условии будет уезжать все больше вниз.
Для фильтра по 3м доп.свойствам это будет уже 'shop_items_catalog_rest' > -6, по четырем - 'shop_items_catalog_rest' > -8.

В качестве более-менее логичного (но все равно плохого) решения можно предложить ввести зависимость от числа складов у магазина, их число можно получить через api http://www.hostcms.ru/api/HostCMS_5/warehouse.html#methodGetAllWarehousesForShop посчитав
$warehouses_count = sizeof($aWarehouses)

и введя эту переменную в условие
$element['value'] = $warehouses_count * -2;

Это зафиксирует нижнюю границу остатка на одном уровне, независимо от параметров фильтрации.

Почему это решение все равно плохое - потому что на деле, склады не поддерживают (да и не должны поддерживать) отрицательного количества товаров.
Та же самая sql-функция SUM может преподнести вам сюрпризы, если у вас, к примеру, на одном складе товар уже помечен как устаревший (-2), а на другом - как доступный под заказ (-1).
Правильный вариант - сделать это на доп.свойстве типа Список (если у вас редакция от "Малый бизнес" и старше) или двух доп.свойствах типа Флажок (если у вас редакция "Халява" или "Мой сайт".
Заказов не беру. Консультирую редко.
#
Re: Убрать в интернет-магазине товары которых нет в наличии
Kotoff писал(а):
Судя по всему, вы прописываете для товара количество -2 на обоих складах.
А в SQL-запросе есть строка

Никак нет, именно на -2 на одном и 0 на другом, если -2 будет на том и другом будет -8.
Т.к. результат данного запроса содержит 2 условия, то строк для каждого товара будет2 * кол-во складов :
[товар]   [параметр] [значение] [склад]
пирожок начинка капуста -2
пирожок форма круглая  -2
пирожок начинка капуста 0
пирожок форма круглая  0
Делаем sum по складу получаем -4
Если в качестве условия ставить 0 то вся сумма будет 0, вот и работает в пройденном решении.

Kotoff писал(а):
которая рассчитывает итоговое количество товара на складах. И для данного товара мы получаем (-2)+(-2)=-4, что, в свою очередь, не дает выполняться условию
'shop_items_catalog_rest' > -2, которое вы описываете под словами

Все правильно это как раз и не должно попадать в условия выборки, тут будет от -4 до -oo в зависимости от условий [параметров] под которые попадает товар.

Kotoff писал(а):
Введенная вами зависимость shop_items_catalog_rest от $count_condition не верна. То есть она у вас работает, но как частный случай. Переменная $count_condition описывает общее число доп.свойств, по которым происходит фильтрация. Если вы будете фильтровать по бОльшему чем 2 кол-ву доп.свойств то нижняя граница остатка в условии будет уезжать все больше вниз.
Для фильтра по 3м доп.свойствам это будет уже 'shop_items_catalog_rest' > -6, по четырем - 'shop_items_catalog_rest' > -8.

Правильно!! ТОЧНО будет - смотрите таблицу с пирожками и делайте сумму если на 2-х складах -1. и товар не попадет в выборку. И именно поэтому так! Тут надо отметить, что товар -1 -1 все же должен попадать. Думаю над этим не сильно, мне достаточно перехода в -1 на одном из складов, на втором я это уже не делаю.
Kotoff писал(а):
и введя эту переменную в условие
$element['value'] = $warehouses_count * -2;

Это зафиксирует нижнюю границу остатка на одном уровне, независимо от параметров фильтрации.

Вот тут не верно, тут как раз нужно как я написал, т.к. тут мы учитываем условия, а не склады.

Если уж и вводить $warehouses_count то тут:
$param['sql_having'] = 'HAVING COUNT(shop_properties_items_table.shop_properties_items_id) = '.$count_condition * $warehouses_count;


Цитата:
Почему это решение все равно плохое - потому что на деле, склады не поддерживают (да и не должны поддерживать) отрицательного количества товаров.
Та же самая sql-функция SUM может преподнести вам сюрпризы, если у вас, к примеру, на одном складе товар уже помечен как устаревший (-2), а на другом - как доступный под заказ (-1).


Тут конечно правда, но в моем частном случае так быть не может -2 и -1, т.к. если он доступен под заказ до доступен сразу на 2-х складах, либо недоступен вообще.

Флажки это первое что я подумал, но в списке товаров в админке надо как-то видеть товар который закрыт, а с флажками никакой наглядности.

Есть мнение, что нужно копнуть в сторону группировки.Тоже думаю пока.
#
Re: Убрать в интернет-магазине товары которых нет в наличии
Вот другой способ, так наверно более правильно.
Правда работает помедленнее.
Ничего не меняем, только добавляем.

      $element = array();
      $element['type'] = 0;
      $element['prefix'] = 'AND';
      $element['name'] = 'shop_items_catalog_table.shop_items_catalog_item_id';
      $element['if'] = 'IN';
      $element['value'] = '(SELECT  shop_warehouse_items_table.shop_items_catalog_item_id FROM `shop_warehouse_items_table` WHERE shop_warehouse_items_table.shop_items_catalog_item_id = shop_items_catalog_table.shop_items_catalog_item_id GROUP BY shop_warehouse_items_table.shop_items_catalog_item_id  having MIN(shop_warehouse_items_table.shop_warehouse_items_count) > -2)'; // тут кому чего нужно
      $element['sufix'] = '';
      $param['select'][] = $element;
#
Re: Убрать в интернет-магазине товары которых нет в наличии
Кто нибудь решил проблему с маркетом (не выгружать товары которых нет в наличии)? желательно на 6 версии?)
Авторизация