How To: Вывод товаров, присутствующих на складе (остаток больше 0)
Контроллер показа Shop_Controller_Show имеет опцию warehouseMode(), которая может принимать следующие значения:
- all — все товары, независимо от остатка на складе (по умолчанию);
- in-stock — товары с положительным остатком на складе;
- in-stock-modification — на складе или модификация товара на складе.
Указать опцию можно в коде типовой динамической страницы интернет-магазина перед show(), например:
$Shop_Controller_Show ->xsl( Core_Entity::factory('Xsl')->getByName($xslName) ) // Выводить свойства товаров ->itemsProperties(TRUE) ... // Учет остатка товаров на складе ->warehouseMode('in-stock') ->show();
* опция warehouseMode() доступна с версии 6.7.5.
Примеры ограничения без использования опции warehouseMode
Ограничение с учетом остатков на складе
Ограничения на вывод товаров задаются через метод shopItems()
контроллера Shop_Controller_Show
, метод возвращает объект Shop_Item_Model
с настроенными ограничениями. Дополним их через queryBuilder():
$fieldName = count($Shop_Controller_Show->getFilterProperties()) || count($Shop_Controller_Show->getFilterPrices()) || $Shop_Controller_Show->producer ? $Shop_Controller_Show->getFilterTableName() . '.shop_item_id' : 'shop_items.id'; $Shop_Controller_Show->shopItems() ->queryBuilder() ->join('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', $fieldName) ->join('shop_warehouses', 'shop_warehouses.id', '=', 'shop_warehouse_items.shop_warehouse_id') ->where('shop_warehouses.active', '=', 1) ->where('shop_warehouses.deleted', '=', 0) ->having('SUM(shop_warehouse_items.count)', '>', 0) ->groupBy($fieldName); $Shop_Controller_Show->show();
Ограничение с учетом остатков на складе модификаций
Вывод товаров, имеющих остатки на складах, либо товаров, имеющих модификации с остатками на складе (без учета активности и пометки на удаление склада).
$fieldName = count($Shop_Controller_Show->getFilterProperties()) || count($Shop_Controller_Show->getFilterPrices()) || $Shop_Controller_Show->producer ? $Shop_Controller_Show->getFilterTableName() . '.shop_item_id' : 'shop_items.id'; $Shop_Controller_Show->shopItems() ->queryBuilder() // Модификации и остатки на складах модификаций ->leftJoin(array('shop_items', 'modifications'), 'modifications.modification_id', '=', $fieldName) ->leftJoin(array('shop_warehouse_items', 'modifications_shop_warehouse_items'), 'modifications_shop_warehouse_items.shop_item_id', '=', 'modifications.id') // Остатки на складах основного отвара ->leftJoin('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', $fieldName) // Есть остатки на основном складе ->havingOpen() ->having('SUM(shop_warehouse_items.count)', '>', 0) // Или ->setOr() // Есть остатки на складах у модификаций ->having('SUM(modifications_shop_warehouse_items.count)', '>', 0) ->havingClose() ->groupBy($fieldName); $Shop_Controller_Show->show();
Не нашли ответ на свой вопрос в документации? Направьте обращение в службу поддержки или онлайн чат.
Комментарии
Только авторизованные пользователи могут оставлять комментарии.