isSaleable()
При работе с шаблонами Magento вы определенно наткнулись на метод isSalable (), примененный к объекту продукта.Метод физически существует, но он только проверяет, имеет ли продукт включенный статус, и проверять товар не следует пропускать.Затем возвращается свойство is_salable
объекта product.
Очевидный вопрос - когда установлено это свойство.После загрузки продукта он уже задан в модели, но не является атрибутом и не является столбцом в плоской таблице продукта.
Как обычно, все странные вещи в Magento выполняются наблюдателями.Mage_Cataloginventory
наблюдает за событием catalog_product_load_after и там оно сводится к Mage_CatalogInventory_Model_Resource_Stock_Status::getProductStatus
и следующему запросу:
SELECT `cataloginventory_stock_status`.`product_id`,
`cataloginventory_stock_status`.`stock_status`
FROM `cataloginventory_stock_status`
WHERE product_id IN('241319')
AND stock_id=1
AND website_id=3;
. Очевидно, что решение о том, продается товар или нет, принимается во время переиндексации.И не обращайте внимания на stock_id, который является своего рода незаконченной функциональностью, которая также появится позже.
Таким образом, мы оказались в месте, куда ни один здравомыслящий разработчик Magento не пойдет охотно ... индексатор.Каталог инвентаря в нашем случае.После быстрого перемещения по лабиринту Mage_CatalogInventory_Model_Indexer_Stock::_processEvent
, Mage_Index_Model_Indexer_Abstract::reindexAll
и Mage_CatalogInventory_Model_Resource_Indexer_Stock::reindexAll
мы обнаруживаем, что у каждого типа продукта есть свой собственный индексатор запасов, который находится в app/code/core/Mage/CatalogInventory/Model/Resource/Indexer/Stock
.
Каждый тип имеет метод _getStockStatusSelect
где SQL-запрос, наконец, решает, продается товар или нет.Несмотря на то, что запрос может показаться массивным, логика не сложна.
Большая часть кода здесь опять-таки элементарная штука.Похоже, что основные разработчики предприняли прекрасную попытку разрешить иметь разные уровни запасов для разных веб-сайтов, но по какой-то причине эта функциональность так и не была завершена.
Так, например, проверка наличия на складе простых продуктов включает только проверку того, что продуктвключено и количество положительно, с флагами управления запасами.Запросы для конфигурируемых и сгруппированных продуктов немного различаются в зависимости от типа продукта.