Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
Grouped.php
Go to the documentation of this file.
1 <?php
9 
11 
17 class Grouped extends \Magento\Catalog\Model\Product\Type\AbstractType
18 {
19  const TYPE_CODE = 'grouped';
20 
26  protected $_keyAssociatedProducts = '_cache_instance_associated_products';
27 
33  protected $_keyAssociatedProductIds = '_cache_instance_associated_product_ids';
34 
40  protected $_keyStatusFilters = '_cache_instance_status_filters';
41 
47  protected $_isComposite = true;
48 
54  protected $_canConfigure = true;
55 
62 
68  protected $_storeManager;
69 
75  protected $productLinks;
76 
80  protected $_appState;
81 
85  protected $msrpData;
86 
105  public function __construct(
106  \Magento\Catalog\Model\Product\Option $catalogProductOption,
107  \Magento\Eav\Model\Config $eavConfig,
108  \Magento\Catalog\Model\Product\Type $catalogProductType,
109  \Magento\Framework\Event\ManagerInterface $eventManager,
110  \Magento\MediaStorage\Helper\File\Storage\Database $fileStorageDb,
111  \Magento\Framework\Filesystem $filesystem,
112  \Magento\Framework\Registry $coreRegistry,
113  \Psr\Log\LoggerInterface $logger,
115  \Magento\GroupedProduct\Model\ResourceModel\Product\Link $catalogProductLink,
116  \Magento\Store\Model\StoreManagerInterface $storeManager,
117  \Magento\Catalog\Model\Product\Attribute\Source\Status $catalogProductStatus,
118  \Magento\Framework\App\State $appState,
119  \Magento\Msrp\Helper\Data $msrpData,
120  \Magento\Framework\Serialize\Serializer\Json $serializer = null
121  ) {
122  $this->productLinks = $catalogProductLink;
123  $this->_storeManager = $storeManager;
124  $this->_catalogProductStatus = $catalogProductStatus;
125  $this->_appState = $appState;
126  $this->msrpData = $msrpData;
127  parent::__construct(
128  $catalogProductOption,
129  $eavConfig,
130  $catalogProductType,
131  $eventManager,
132  $fileStorageDb,
133  $filesystem,
134  $coreRegistry,
135  $logger,
138  );
139  }
140 
146  public function getRelationInfo()
147  {
148  $info = new \Magento\Framework\DataObject();
149  $info->setTable(
150  'catalog_product_link'
151  )->setParentFieldName(
152  'product_id'
153  )->setChildFieldName(
154  'linked_product_id'
155  )->setWhere(
156  'link_type_id=' . \Magento\GroupedProduct\Model\ResourceModel\Product\Link::LINK_TYPE_GROUPED
157  );
158  return $info;
159  }
160 
173  public function getChildrenIds($parentId, $required = true)
174  {
175  return $this->productLinks->getChildrenIds(
176  $parentId,
177  \Magento\GroupedProduct\Model\ResourceModel\Product\Link::LINK_TYPE_GROUPED
178  );
179  }
180 
187  public function getParentIdsByChild($childId)
188  {
189  return $this->productLinks->getParentIdsByChild(
190  $childId,
191  \Magento\GroupedProduct\Model\ResourceModel\Product\Link::LINK_TYPE_GROUPED
192  );
193  }
194 
202  {
203  if (!$product->hasData($this->_keyAssociatedProducts)) {
204  $associatedProducts = [];
205 
206  $this->setSaleableStatus($product);
207 
208  $collection = $this->getAssociatedProductCollection(
209  $product
210  )->addAttributeToSelect(
211  ['name', 'price', 'special_price', 'special_from_date', 'special_to_date', 'tax_class_id']
212  )->addFilterByRequiredOptions()->setPositionOrder()->addStoreFilter(
213  $this->getStoreFilter($product)
214  )->addAttributeToFilter(
215  'status',
216  ['in' => $this->getStatusFilters($product)]
217  );
218 
219  foreach ($collection as $item) {
220  $associatedProducts[] = $item;
221  }
222 
223  $product->setData($this->_keyAssociatedProducts, $associatedProducts);
224  }
225  return $product->getData($this->_keyAssociatedProducts);
226  }
227 
234  {
235  return $product->unsData($this->_keyAssociatedProducts);
236  }
237 
245  public function addStatusFilter($status, $product)
246  {
247  $statusFilters = $product->getData($this->_keyStatusFilters);
248  if (!is_array($statusFilters)) {
249  $statusFilters = [];
250  }
251 
252  $statusFilters[] = $status;
253  $product->setData($this->_keyStatusFilters, $statusFilters);
254 
255  return $this;
256  }
257 
264  public function setSaleableStatus($product)
265  {
266  $product->setData($this->_keyStatusFilters, $this->_catalogProductStatus->getSaleableStatusIds());
267  return $this;
268  }
269 
276  public function getStatusFilters($product)
277  {
278  if (!$product->hasData($this->_keyStatusFilters)) {
279  return [
280  \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED,
281  \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED,
282  ];
283  }
284  return $product->getData($this->_keyStatusFilters);
285  }
286 
293  public function getAssociatedProductIds($product)
294  {
295  if (!$product->hasData($this->_keyAssociatedProductIds)) {
298  foreach ($this->getAssociatedProducts($product) as $item) {
299  $associatedProductIds[] = $item->getId();
300  }
301  $product->setData($this->_keyAssociatedProductIds, $associatedProductIds);
302  }
303  return $product->getData($this->_keyAssociatedProductIds);
304  }
305 
312  public function getAssociatedProductCollection($product)
313  {
315  $links = $product->getLinkInstance();
316  $links->setLinkTypeId(\Magento\GroupedProduct\Model\ResourceModel\Product\Link::LINK_TYPE_GROUPED);
317  $collection = $links->getProductCollection()->setFlag(
318  'product_children',
319  true
320  )->setIsStrongMode();
321  $collection->setProduct($product);
322  return $collection;
323  }
324 
331  protected function getProductInfo(\Magento\Framework\DataObject $buyRequest, $product, $isStrictProcessMode)
332  {
333  $productsInfo = $buyRequest->getSuperGroup() ?: [];
334  $associatedProducts = $this->getAssociatedProducts($product);
335 
336  if (!is_array($productsInfo)) {
337  return __('Please specify the quantity of product(s).')->render();
338  }
339  foreach ($associatedProducts as $subProduct) {
340  if (!isset($productsInfo[$subProduct->getId()])) {
341  if ($isStrictProcessMode && !$subProduct->getQty()) {
342  return __('Please specify the quantity of product(s).')->render();
343  }
344  $productsInfo[$subProduct->getId()] = intval($subProduct->getQty());
345  }
346  }
347 
348  return $productsInfo;
349  }
350 
362  protected function _prepareProduct(\Magento\Framework\DataObject $buyRequest, $product, $processMode)
363  {
364  $products = [];
365  $associatedProductsInfo = [];
366  $isStrictProcessMode = $this->_isStrictProcessMode($processMode);
367  $productsInfo = $this->getProductInfo($buyRequest, $product, $isStrictProcessMode);
368  if (is_string($productsInfo)) {
369  return $productsInfo;
370  }
371  $associatedProducts = !$isStrictProcessMode || !empty($productsInfo)
373  : false;
374 
375  foreach ($associatedProducts as $subProduct) {
376  $qty = $productsInfo[$subProduct->getId()];
377  if (!is_numeric($qty) || empty($qty)) {
378  continue;
379  }
380 
381  $_result = $subProduct->getTypeInstance()->_prepareProduct($buyRequest, $subProduct, $processMode);
382 
383  if (is_string($_result)) {
384  return $_result;
385  } elseif (!isset($_result[0])) {
386  return __('Cannot process the item.')->render();
387  }
388 
389  if ($isStrictProcessMode) {
390  $_result[0]->setCartQty($qty);
391  $_result[0]->addCustomOption('product_type', self::TYPE_CODE, $product);
392  $_result[0]->addCustomOption(
393  'info_buyRequest',
394  $this->serializer->serialize(
395  [
396  'super_product_config' => [
397  'product_type' => self::TYPE_CODE,
398  'product_id' => $product->getId(),
399  ],
400  ]
401  )
402  );
403  $products[] = $_result[0];
404  } else {
405  $associatedProductsInfo[] = [$subProduct->getId() => $qty];
406  $product->addCustomOption('associated_product_' . $subProduct->getId(), $qty);
407  }
408  }
409 
410  if (!$isStrictProcessMode || count($associatedProductsInfo)) {
411  $product->addCustomOption('product_type', self::TYPE_CODE, $product);
412  $product->addCustomOption('info_buyRequest', $this->serializer->serialize($buyRequest->getData()));
413 
414  $products[] = $product;
415  }
416 
417  if (count($products)) {
418  return $products;
419  }
420 
421  return __('Please specify the quantity of product(s).')->render();
422  }
423 
432  {
433  return [$this->getAssociatedProducts($product)];
434  }
435 
445  {
446  $superGroup = $buyRequest->getSuperGroup();
447  $superGroup = is_array($superGroup) ? array_filter($superGroup, 'intval') : [];
448 
449  $options = ['super_group' => $superGroup];
450 
451  return $options;
452  }
453 
459  public function hasWeight()
460  {
461  return false;
462  }
463 
471  public function deleteTypeSpecificData(\Magento\Catalog\Model\Product $product)
472  {
473  }
474 
478  public function beforeSave($product)
479  {
480  //clear cached associated links
481  $product->unsetData($this->_keyAssociatedProducts);
482  if ($product->hasData('product_options') && !empty($product->getData('product_options'))) {
483  throw new \Exception('Custom options for grouped product type are not supported');
484  }
485  return parent::beforeSave($product);
486  }
487 
492  public function getChildrenMsrp(\Magento\Catalog\Model\Product $product)
493  {
494  $prices = [];
495  foreach ($this->getAssociatedProducts($product) as $item) {
496  if ($item->getMsrp() !== null) {
497  $prices[] = $item->getMsrp();
498  }
499  }
500  return $prices ? min($prices) : 0;
501  }
502 }
elseif(isset( $params[ 'redirect_parent']))
Definition: iframe.phtml:17
getChildrenMsrp(\Magento\Catalog\Model\Product $product)
Definition: Grouped.php:492
$storeManager
__()
Definition: __.php:13
$logger
__construct(\Magento\Catalog\Model\Product\Option $catalogProductOption, \Magento\Eav\Model\Config $eavConfig, \Magento\Catalog\Model\Product\Type $catalogProductType, \Magento\Framework\Event\ManagerInterface $eventManager, \Magento\MediaStorage\Helper\File\Storage\Database $fileStorageDb, \Magento\Framework\Filesystem $filesystem, \Magento\Framework\Registry $coreRegistry, \Psr\Log\LoggerInterface $logger, ProductRepositoryInterface $productRepository, \Magento\GroupedProduct\Model\ResourceModel\Product\Link $catalogProductLink, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Catalog\Model\Product\Attribute\Source\Status $catalogProductStatus, \Magento\Framework\App\State $appState, \Magento\Msrp\Helper\Data $msrpData, \Magento\Framework\Serialize\Serializer\Json $serializer=null)
Definition: Grouped.php:105
_prepareProduct(\Magento\Framework\DataObject $buyRequest, $product, $processMode)
Definition: Grouped.php:362
getProductInfo(\Magento\Framework\DataObject $buyRequest, $product, $isStrictProcessMode)
Definition: Grouped.php:331
$status
Definition: order_status.php:8
foreach($product->getExtensionAttributes() ->getBundleProductOptions() as $option) $buyRequest
getChildrenIds($parentId, $required=true)
Definition: Grouped.php:173
foreach( $_productCollection as $_product)() ?>" class $info
Definition: listing.phtml:52
$filesystem
deleteTypeSpecificData(\Magento\Catalog\Model\Product $product)
Definition: Grouped.php:471
$required
Definition: wrapper.phtml:8