How To: Вывод товаров, присутствующих на складе (остаток больше 0)

Контроллер показа Shop_Controller_Show имеет опцию warehouseMode(), которая может принимать следующие значения:

Указать опцию можно в коде типовой динамической страницы интернет-магазина перед 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();

Не нашли ответ на свой вопрос в документации? Направьте обращение в службу поддержки или онлайн чат.

Комментарии

  • Использование в фильтре

    Есть ли возможность использовать данный функционал в фильтре?

    10.04.2021 09:55:13
    DmitryOpalev

    Без темы

    Не очень понятно, что значит в фильтре. Попробуйте, если не получится - обратитесь в поддержку.

    12.04.2021 10:45:47
    hostcms