*/ class Mage_Checkout_Block_Cart_Crosssell extends Mage_Catalog_Block_Product_Abstract { /** * Items quantity will be capped to this value * * @var int */ protected $_maxItemCount = 4; /** * Get crosssell items * * @return array */ public function getItems() { $items = $this->getData('items'); if (is_null($items)) { $items = array(); $ninProductIds = $this->_getCartProductIds(); if ($ninProductIds) { $lastAdded = (int) $this->_getLastAddedProductId(); if ($lastAdded) { $collection = $this->_getCollection() ->addProductFilter($lastAdded); if (!empty($ninProductIds)) { $collection->addExcludeProductFilter($ninProductIds); } $collection->setPositionOrder()->load(); foreach ($collection as $item) { $ninProductIds[] = $item->getId(); $items[] = $item; } } if (count($items) < $this->_maxItemCount) { $filterProductIds = array_merge($this->_getCartProductIds(), $this->_getCartProductIdsRel()); $collection = $this->_getCollection() ->addProductFilter($filterProductIds) ->addExcludeProductFilter($ninProductIds) ->setPageSize($this->_maxItemCount-count($items)) ->setGroupBy() ->setPositionOrder() ->load(); foreach ($collection as $item) { $items[] = $item; } } } $this->setData('items', $items); } return $items; } /** * Count items * * @return int */ public function getItemCount() { return count($this->getItems()); } /** * Get ids of products that are in cart * * @return array */ protected function _getCartProductIds() { $ids = $this->getData('_cart_product_ids'); if (is_null($ids)) { $ids = array(); foreach ($this->getQuote()->getAllItems() as $item) { if ($product = $item->getProduct()) { $ids[] = $product->getId(); } } $this->setData('_cart_product_ids', $ids); } return $ids; } /** * Retrieve Array of product ids which have special relation with products in Cart * For example simple product as part of Grouped product * * @return array */ protected function _getCartProductIdsRel() { $productIds = array(); foreach ($this->getQuote()->getAllItems() as $quoteItem) { $productTypeOpt = $quoteItem->getOptionByCode('product_type'); if ($productTypeOpt instanceof Mage_Sales_Model_Quote_Item_Option && $productTypeOpt->getValue() == Mage_Catalog_Model_Product_Type_Grouped::TYPE_CODE && $productTypeOpt->getProductId() ) { $productIds[] = $productTypeOpt->getProductId(); } } return $productIds; } /** * Get last product ID that was added to cart and remove this information from session * * @return int */ protected function _getLastAddedProductId() { return Mage::getSingleton('checkout/session')->getLastAddedProductId(true); } /** * Get quote instance * * @return Mage_Sales_Model_Quote */ public function getQuote() { return Mage::getSingleton('checkout/session')->getQuote(); } /** * Get crosssell products collection * * @return Mage_Catalog_Model_Resource_Eav_Mysql4_Product_Link_Product_Collection */ protected function _getCollection() { $collection = Mage::getModel('catalog/product_link')->useCrossSellLinks() ->getProductCollection() ->setStoreId(Mage::app()->getStore()->getId()) ->addStoreFilter() ->setPageSize($this->_maxItemCount); $this->_addProductAttributesAndPrices($collection); Mage::getSingleton('catalog/product_status')->addSaleableFilterToCollection($collection); Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection); Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($collection); return $collection; } }