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();