Сопутствующие товары Magento исчезают вместе с максимальным количеством товара в корзине
В Magento мы установили "Отображать товары, отсутствующие на складе" => "Да"
На страницах товаров у нас есть раздел "Сопутствующие товары" (related.phml
=> if($this->getItems()->getSize()):
)
Однако, когда Maximum Qty Allowed in Shopping Cart
достигнуто, продукт исчезает из связанных продуктов (а также из распродаж).
Почему это так и как я вообще могу отображать эти продукты?
1 answers
Товары не должны появляться в связанных или распродажах, если они уже есть в корзине. Количество, которое находится в корзине, в данном случае не имеет значения.
Вот как это работает в блоке Related.php
.
Mage_Catalog_Block_Product_List_Related::_prepareData
выглядит примерно так:
protected function _prepareData()
{
$product = Mage::registry('product');
/* @var $product Mage_Catalog_Model_Product */
$this->_itemCollection = $product->getRelatedProductCollection()
->addAttributeToSelect('required_options')
->setPositionOrder()
->addStoreFilter()
;
if (Mage::helper('catalog')->isModuleEnabled('Mage_Checkout')) {
Mage::getResourceSingleton('checkout/cart')->addExcludeProductFilter($this->_itemCollection,
Mage::getSingleton('checkout/session')->getQuoteId()
);
$this->_addProductAttributesAndPrices($this->_itemCollection);
}
//Mage::getSingleton('catalog/product_status')->addSaleableFilterToCollection($this->_itemCollection);
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($this->_itemCollection);
$this->_itemCollection->load();
foreach ($this->_itemCollection as $product) {
$product->setDoNotUseCategoryId(true);
}
return $this;
}
Обратите внимание на строки
Mage::getResourceSingleton('checkout/cart')->addExcludeProductFilter($this->_itemCollection,
Mage::getSingleton('checkout/session')->getQuoteId()
);
Это вызов Mage_Checkout_Model_Resource_Cart::addExcludeProductFilter
, который выглядит так
public function addExcludeProductFilter($collection, $quoteId)
{
$adapter = $this->_getReadAdapter();
$exclusionSelect = $adapter->select()
->from($this->getTable('sales/quote_item'), array('product_id'))
->where('quote_id = ?', $quoteId);
$condition = $adapter->prepareSqlCondition('e.entity_id', array('nin' => $exclusionSelect));
$collection->getSelect()->where($condition);
return $this;
}
И то, что он делает, - это получает идентификаторы товара, уже находящегося в корзине, и добавляет инструкцию where entity_id NOT IN (...)
к выбору для соответствующих товаров.
То же самое происходит и с Mage_Catalog_Block_Product_List_Upsell::_prepareData
.
Таким образом, если вы не изменили это поведение, максимальное количество, разрешенное в корзине, не имеет значения.