Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Crosssell.php
Go to the documentation of this file.
1 <?php
7 
9 
18 {
24  protected $_maxItemCount = 4;
25 
29  protected $_checkoutSession;
30 
35 
39  protected $stockHelper;
40 
45 
50 
63  public function __construct(
64  \Magento\Catalog\Block\Product\Context $context,
65  \Magento\Checkout\Model\Session $checkoutSession,
66  \Magento\Catalog\Model\Product\Visibility $productVisibility,
67  \Magento\Catalog\Model\Product\LinkFactory $productLinkFactory,
68  \Magento\Quote\Model\Quote\Item\RelatedProducts $itemRelationsList,
69  StockHelper $stockHelper,
70  array $data = []
71  ) {
72  $this->_checkoutSession = $checkoutSession;
73  $this->_productVisibility = $productVisibility;
74  $this->_productLinkFactory = $productLinkFactory;
75  $this->_itemRelationsList = $itemRelationsList;
76  $this->stockHelper = $stockHelper;
77  parent::__construct(
78  $context,
79  $data
80  );
81  $this->_isScopePrivate = true;
82  }
83 
89  public function getItems()
90  {
91  $items = $this->getData('items');
92  if ($items === null) {
93  $items = [];
94  $ninProductIds = $this->_getCartProductIds();
95  if ($ninProductIds) {
96  $lastAdded = (int)$this->_getLastAddedProductId();
97  if ($lastAdded) {
98  $collection = $this->_getCollection()->addProductFilter($lastAdded);
99  if (!empty($ninProductIds)) {
100  $collection->addExcludeProductFilter($ninProductIds);
101  }
102  $collection->setPositionOrder()->load();
103 
104  foreach ($collection as $item) {
105  $ninProductIds[] = $item->getId();
106  $items[] = $item;
107  }
108  }
109 
110  if (count($items) < $this->_maxItemCount) {
111  $filterProductIds = array_merge(
112  $this->_getCartProductIds(),
113  $this->_itemRelationsList->getRelatedProductIds($this->getQuote()->getAllItems())
114  );
115  $collection = $this->_getCollection()->addProductFilter(
116  $filterProductIds
117  )->addExcludeProductFilter(
118  $ninProductIds
119  )->setPageSize(
120  $this->_maxItemCount - count($items)
121  )->setGroupBy()->setPositionOrder()->load();
122  foreach ($collection as $item) {
123  $items[] = $item;
124  }
125  }
126  }
127 
128  $this->setData('items', $items);
129  }
130  return $items;
131  }
132 
139  public function getItemCount()
140  {
141  return count($this->getItems());
142  }
143 
149  protected function _getCartProductIds()
150  {
151  $ids = $this->getData('_cart_product_ids');
152  if ($ids === null) {
153  $ids = [];
154  foreach ($this->getQuote()->getAllItems() as $item) {
155  $product = $item->getProduct();
156  if ($product) {
157  $ids[] = $product->getId();
158  }
159  }
160  $this->setData('_cart_product_ids', $ids);
161  }
162  return $ids;
163  }
164 
171  protected function _getLastAddedProductId()
172  {
173  return $this->_checkoutSession->getLastAddedProductId(true);
174  }
175 
182  public function getQuote()
183  {
184  return $this->_checkoutSession->getQuote();
185  }
186 
192  protected function _getCollection()
193  {
195  $collection = $this->_productLinkFactory->create()->useCrossSellLinks()->getProductCollection()->setStoreId(
196  $this->_storeManager->getStore()->getId()
197  )->addStoreFilter()->setPageSize(
198  $this->_maxItemCount
199  )->setVisibility(
200  $this->_productVisibility->getVisibleInCatalogIds()
201  );
203 
204  return $collection;
205  }
206 }
getData($key='', $index=null)
Definition: DataObject.php:119
$productLinkFactory
setData($key, $value=null)
Definition: DataObject.php:72
_addProductAttributesAndPrices(\Magento\Catalog\Model\ResourceModel\Product\Collection $collection)
__construct(\Magento\Catalog\Block\Product\Context $context, \Magento\Checkout\Model\Session $checkoutSession, \Magento\Catalog\Model\Product\Visibility $productVisibility, \Magento\Catalog\Model\Product\LinkFactory $productLinkFactory, \Magento\Quote\Model\Quote\Item\RelatedProducts $itemRelationsList, StockHelper $stockHelper, array $data=[])
Definition: Crosssell.php:63
$items