Сопутствующие товары Magento исчезают вместе с максимальным количеством товара в корзине


В Magento мы установили "Отображать товары, отсутствующие на складе" => "Да"

На страницах товаров у нас есть раздел "Сопутствующие товары" (related.phml => if($this->getItems()->getSize()):)

Однако, когда Maximum Qty Allowed in Shopping Cart достигнуто, продукт исчезает из связанных продуктов (а также из распродаж).

Почему это так и как я вообще могу отображать эти продукты?

Author: Richard, 2015-10-09

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.
Таким образом, если вы не изменили это поведение, максимальное количество, разрешенное в корзине, не имеет значения.

 3
Author: Marius, 2015-10-12 09:25:19