This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
private:koding:hostcms:modules:shop:elements:hidenotalloweditemsandmods [20.11.15 в 18:31] maximzasorin_gmail.com |
private:koding:hostcms:modules:shop:elements:hidenotalloweditemsandmods [27.06.17 в 15:39] (current) maximzasorin_gmail.com ↷ Страница перемещена из private:koding:hostcms:shop:hidenotalloweditemsandmods в private:koding:hostcms:modules:shop:elements:hidenotalloweditemsandmods |
||
---|---|---|---|
Line 43: | Line 43: | ||
$oCurrent_Warehouse = $oShop->Shop_Warehouses->getDefault(); | $oCurrent_Warehouse = $oShop->Shop_Warehouses->getDefault(); | ||
+ | // Вариант 1. Некорректный, но менее затратный вариант, в этом случае ярлыки товаров не будут | ||
+ | // проверяться на наличие на текущем складе, а будут выводится все время | ||
$object->shopItems() | $object->shopItems() | ||
->queryBuilder() | ->queryBuilder() | ||
- | ->leftJoin('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', 'shop_items.id', array( | + | ->leftJoin('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', 'shop_items.id') |
- | array( | + | ->open() |
- | 'AND' => array('shop_warehouse_items.shop_warehouse_id', '=', $oCurrent_Warehouse->id) | + | ->where('shop_warehouse_items.count', '>', 0) |
- | ) | + | ->where('shop_warehouse_items.shop_warehouse_id', '=', $oCurrentWarehouse->id) |
- | ) | + | ->setOr() |
- | ) | + | ->where('shop_items.shortcut_id', '!=', 0) |
- | ->where('shop_warehouse_items.count', '>', 0); | + | ->close() |
+ | ; | ||
+ | |||
+ | // // Вариант 2. Корректный, с LEFT JOIN, но более затратный, в этом случае все ярлыки будут корректно | ||
+ | // // обрабатываться условием наличия на складе. Данный вариант предусматривает сложное объединение таблиц через LEFT JOIN ... OR | ||
+ | // // и может выполняется значительное время, особенно на объемных интернет-магазинах | ||
+ | // $object->shopItems() | ||
+ | // ->queryBuilder() | ||
+ | // ->leftJoin('shop_warehouse_items', 'shop_warehouse_items.shop_item_id', '=', 'shop_items.id', array( | ||
+ | // array('OR' => array('shop_warehouse_items.shop_item_id', '=', Core_QueryBuilder::expression('`shop_items`.`shortcut_id`'))), | ||
+ | // ) | ||
+ | // ) | ||
+ | // ->where('shop_warehouse_items.count', '>', 0) | ||
+ | // ->where('AND' => array('shop_warehouse_items.shop_warehouse_id', '=', $oCurrentWarehouse->id)) | ||
+ | // ; | ||
+ | |||
+ | // var_dump($object->shopItems()->queryBuilder()->build()); | ||
} | } | ||
} | } | ||
}</code> | }</code> | ||
+ | * Решение предусматривает обработку ярлыков, но с ними могут быть проблемы в интернет-магазинах с большим количеством товаров, из-за чего в наблюдателе предусмотрено два варианта выборки, один из них отбрасывает ярлыки при сравнении, а другой корректно обрабатывает их, но может выполняться значительно время (см. комментарии в наблюдателе). | ||
===== Модификации ===== | ===== Модификации ===== | ||
Line 106: | Line 125: | ||
}</code> | }</code> | ||
- | Константа REGION_PRICES_SHOP_ID задает идентификатор интернет-магазина, для которого хотим скрыть товары и модификации товаров. | + | Константа ''REGION_PRICES_SHOP_ID'' задает идентификатор интернет-магазина, для которого хотим скрыть товары и модификации товаров. |
- | Если наблюдатель не срабатывает на странице интернет-магазина, то возможно в ТДС используется класс, наследованный от Shop_Controller_Show, например, с названием My_Shop_Controller_Show, или другой. Для такого класса нужно назначить наблюдатель отдельно. В ''bootstrap.php'' добавляем код:<code php> | + | Если наблюдатель не срабатывает на странице интернет-магазина, то возможно в ТДС используется класс, наследованный от ''Shop_Controller_Show'', например, с названием ''My_Shop_Controller_Show'', или другой. Для такого класса нужно назначить наблюдатель отдельно. В ''bootstrap.php'' добавляем код:<code php> |
Core_Event::attach('My_Shop_Controller_Show.onBeforeRedeclaredShow', array('Kad_Shop_Item_Observers_Hidenotavailableitems', 'onBeforeRedeclaredShow'));</code> | Core_Event::attach('My_Shop_Controller_Show.onBeforeRedeclaredShow', array('Kad_Shop_Item_Observers_Hidenotavailableitems', 'onBeforeRedeclaredShow'));</code> |