Magento 2 Documentation  2.3
Documentation for Magento 2 CMS v2.3 (December 2018)
SaveAction.php
Go to the documentation of this file.
1 <?php
6 declare(strict_types=1);
7 
9 
17 
22 {
26  private $optionResource;
27 
31  private $metadataPool;
32 
36  private $type;
37 
41  private $linkManagement;
42 
49  public function __construct(
50  Option $optionResource,
51  MetadataPool $metadataPool,
52  Type $type,
53  ProductLinkManagementInterface $linkManagement
54  ) {
55  $this->optionResource = $optionResource;
56  $this->metadataPool = $metadataPool;
57  $this->type = $type;
58  $this->linkManagement = $linkManagement;
59  }
60 
71  {
72  $metadata = $this->metadataPool->getMetadata(\Magento\Catalog\Api\Data\ProductInterface::class);
73 
74  $option->setStoreId($bundleProduct->getStoreId());
75  $parentId = $bundleProduct->getData($metadata->getLinkField());
76  $option->setParentId($parentId);
77 
78  $optionId = $option->getOptionId();
79  $linksToAdd = [];
80  $optionCollection = $this->type->getOptionsCollection($bundleProduct);
81  $optionCollection->setIdFilter($option->getOptionId());
82  $optionCollection->setProductLinkFilter($parentId);
83 
85  $existingOption = $optionCollection->getFirstItem();
86  if (!$optionId || $existingOption->getParentId() != $parentId) {
87  //If option ID is empty or existing option's parent ID is different
88  //we'd need a new ID for the option.
89  $option->setOptionId(null);
90  $option->setDefaultTitle($option->getTitle());
91  if (is_array($option->getProductLinks())) {
92  $linksToAdd = $option->getProductLinks();
93  }
94  } else {
95  if (!$existingOption->getOptionId()) {
96  throw new NoSuchEntityException(
97  __("The option that was requested doesn't exist. Verify the entity and try again.")
98  );
99  }
100 
101  $option->setData(array_merge($existingOption->getData(), $option->getData()));
102  $this->updateOptionSelection($bundleProduct, $option);
103  }
104 
105  try {
106  $this->optionResource->save($option);
107  } catch (\Exception $e) {
108  throw new CouldNotSaveException(__("The option couldn't be saved."), $e);
109  }
110 
112  foreach ($linksToAdd as $linkedProduct) {
113  $this->linkManagement->addChild($bundleProduct, $option->getOptionId(), $linkedProduct);
114  }
115 
116  $bundleProduct->setIsRelationsChanged(true);
117 
118  return $option;
119  }
120 
128  private function updateOptionSelection(ProductInterface $product, OptionInterface $option)
129  {
130  $optionId = $option->getOptionId();
131  $existingLinks = $this->linkManagement->getChildren($product->getSku(), $optionId);
132  $linksToAdd = [];
133  $linksToUpdate = [];
134  $linksToDelete = [];
135  if (is_array($option->getProductLinks())) {
136  $productLinks = $option->getProductLinks();
137  foreach ($productLinks as $productLink) {
138  if (!$productLink->getId() && !$productLink->getSelectionId()) {
139  $linksToAdd[] = $productLink;
140  } else {
141  $linksToUpdate[] = $productLink;
142  }
143  }
145  $linksToDelete = $this->compareLinks($existingLinks, $linksToUpdate);
146  }
147  foreach ($linksToUpdate as $linkedProduct) {
148  $this->linkManagement->saveChild($product->getSku(), $linkedProduct);
149  }
150  foreach ($linksToDelete as $linkedProduct) {
151  $this->linkManagement->removeChild(
152  $product->getSku(),
153  $option->getOptionId(),
154  $linkedProduct->getSku()
155  );
156  }
157  foreach ($linksToAdd as $linkedProduct) {
158  $this->linkManagement->addChild($product, $option->getOptionId(), $linkedProduct);
159  }
160  }
161 
170  private function compareLinks(array $firstArray, array $secondArray)
171  {
172  $result = [];
173 
174  $firstArrayIds = [];
175  $firstArrayMap = [];
176 
177  $secondArrayIds = [];
178 
179  foreach ($firstArray as $item) {
180  $firstArrayIds[] = $item->getId();
181 
182  $firstArrayMap[$item->getId()] = $item;
183  }
184 
185  foreach ($secondArray as $item) {
186  $secondArrayIds[] = $item->getId();
187  }
188 
189  foreach (array_diff($firstArrayIds, $secondArrayIds) as $id) {
190  $result[] = $firstArrayMap[$id];
191  }
192 
193  return $result;
194  }
195 }
$id
Definition: fieldset.phtml:14
__()
Definition: __.php:13
$type
Definition: item.phtml:13
__construct(Option $optionResource, MetadataPool $metadataPool, Type $type, ProductLinkManagementInterface $linkManagement)
Definition: SaveAction.php:49
$linkedProduct
$bundleProduct