77
88namespace Magento \Bundle \Model ;
99
10+ use Magento \Bundle \Model \Option \SaveAction ;
1011use Magento \Catalog \Api \Data \ProductInterface ;
11- use Magento \Framework \App \ObjectManager ;
12- use Magento \Framework \EntityManager \MetadataPool ;
13- use Magento \Framework \Exception \CouldNotSaveException ;
1412use Magento \Framework \Exception \InputException ;
1513use Magento \Framework \Exception \NoSuchEntityException ;
1614
1715/**
16+ * Repository for performing CRUD operations for a bundle product's options.
17+ *
1818 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1919 */
2020class OptionRepository implements \Magento \Bundle \Api \ProductOptionRepositoryInterface
@@ -39,11 +39,6 @@ class OptionRepository implements \Magento\Bundle\Api\ProductOptionRepositoryInt
3939 */
4040 protected $ optionResource ;
4141
42- /**
43- * @var \Magento\Store\Model\StoreManager
44- */
45- protected $ storeManager ;
46-
4742 /**
4843 * @var \Magento\Bundle\Api\ProductLinkManagementInterface
4944 */
@@ -54,53 +49,44 @@ class OptionRepository implements \Magento\Bundle\Api\ProductOptionRepositoryInt
5449 */
5550 protected $ productOptionList ;
5651
57- /**
58- * @var Product\LinksList
59- */
60- protected $ linkList ;
61-
6252 /**
6353 * @var \Magento\Framework\Api\DataObjectHelper
6454 */
6555 protected $ dataObjectHelper ;
6656
6757 /**
68- * @var \Magento\Framework\EntityManager\MetadataPool
58+ * @var SaveAction
6959 */
70- private $ metadataPool ;
60+ private $ optionSave ;
7161
7262 /**
7363 * @param \Magento\Catalog\Api\ProductRepositoryInterface $productRepository
7464 * @param Product\Type $type
7565 * @param \Magento\Bundle\Api\Data\OptionInterfaceFactory $optionFactory
7666 * @param \Magento\Bundle\Model\ResourceModel\Option $optionResource
77- * @param \Magento\Store\Model\StoreManagerInterface $storeManager
7867 * @param \Magento\Bundle\Api\ProductLinkManagementInterface $linkManagement
7968 * @param Product\OptionList $productOptionList
80- * @param Product\LinksList $linkList
8169 * @param \Magento\Framework\Api\DataObjectHelper $dataObjectHelper
82- * @SuppressWarnings(PHPMD.ExcessiveParameterList)
70+ * @param SaveAction $optionSave
8371 */
8472 public function __construct (
8573 \Magento \Catalog \Api \ProductRepositoryInterface $ productRepository ,
8674 \Magento \Bundle \Model \Product \Type $ type ,
8775 \Magento \Bundle \Api \Data \OptionInterfaceFactory $ optionFactory ,
8876 \Magento \Bundle \Model \ResourceModel \Option $ optionResource ,
89- \Magento \Store \Model \StoreManagerInterface $ storeManager ,
9077 \Magento \Bundle \Api \ProductLinkManagementInterface $ linkManagement ,
9178 \Magento \Bundle \Model \Product \OptionList $ productOptionList ,
92- \Magento \Bundle \ Model \ Product \ LinksList $ linkList ,
93- \ Magento \ Framework \ Api \ DataObjectHelper $ dataObjectHelper
79+ \Magento \Framework \ Api \ DataObjectHelper $ dataObjectHelper ,
80+ SaveAction $ optionSave
9481 ) {
9582 $ this ->productRepository = $ productRepository ;
9683 $ this ->type = $ type ;
9784 $ this ->optionFactory = $ optionFactory ;
9885 $ this ->optionResource = $ optionResource ;
99- $ this ->storeManager = $ storeManager ;
10086 $ this ->linkManagement = $ linkManagement ;
10187 $ this ->productOptionList = $ productOptionList ;
102- $ this ->linkList = $ linkList ;
10388 $ this ->dataObjectHelper = $ dataObjectHelper ;
89+ $ this ->optionSave = $ optionSave ;
10490 }
10591
10692 /**
@@ -118,7 +104,7 @@ public function get($sku, $optionId)
118104 );
119105 }
120106
121- $ productLinks = $ this ->linkList -> getItems ($ product , $ optionId );
107+ $ productLinks = $ this ->linkManagement -> getChildren ($ product-> getSku () , $ optionId );
122108
123109 /** @var \Magento\Bundle\Api\Data\OptionInterface $option */
124110 $ optionDataObject = $ this ->optionFactory ->create ();
@@ -177,7 +163,9 @@ public function deleteById($sku, $optionId)
177163 $ product = $ this ->getProduct ($ sku );
178164 $ optionCollection = $ this ->type ->getOptionsCollection ($ product );
179165 $ optionCollection ->setIdFilter ($ optionId );
180- return $ this ->delete ($ optionCollection ->getFirstItem ());
166+ $ hasBeenDeleted = $ this ->delete ($ optionCollection ->getFirstItem ());
167+
168+ return $ hasBeenDeleted ;
181169 }
182170
183171 /**
@@ -187,51 +175,12 @@ public function save(
187175 \Magento \Catalog \Api \Data \ProductInterface $ product ,
188176 \Magento \Bundle \Api \Data \OptionInterface $ option
189177 ) {
190- $ metadata = $ this ->getMetadataPool ()->getMetadata (\Magento \Catalog \Api \Data \ProductInterface::class);
191-
192- $ option ->setStoreId ($ product ->getStoreId ());
193- $ parentId = $ product ->getData ($ metadata ->getLinkField ());
194- $ option ->setParentId ($ parentId );
195-
196- $ optionId = $ option ->getOptionId ();
197- $ linksToAdd = [];
198- $ optionCollection = $ this ->type ->getOptionsCollection ($ product );
199- $ optionCollection ->setIdFilter ($ option ->getOptionId ());
200- $ optionCollection ->setProductLinkFilter ($ parentId );
201-
202- /** @var \Magento\Bundle\Model\Option $existingOption */
203- $ existingOption = $ optionCollection ->getFirstItem ();
204- if (!$ optionId || $ existingOption ->getParentId () != $ parentId ) {
205- //If option ID is empty or existing option's parent ID is different
206- //we'd need a new ID for the option.
207- $ option ->setOptionId (null );
208- $ option ->setDefaultTitle ($ option ->getTitle ());
209- if (is_array ($ option ->getProductLinks ())) {
210- $ linksToAdd = $ option ->getProductLinks ();
211- }
212- } else {
213- if (!$ existingOption ->getOptionId ()) {
214- throw new NoSuchEntityException (
215- __ ("The option that was requested doesn't exist. Verify the entity and try again. " )
216- );
217- }
178+ $ savedOption = $ this ->optionSave ->save ($ product , $ option );
218179
219- $ option ->setData (array_merge ($ existingOption ->getData (), $ option ->getData ()));
220- $ this ->updateOptionSelection ($ product , $ option );
221- }
180+ $ productToSave = $ this ->productRepository ->get ($ product ->getSku ());
181+ $ this ->productRepository ->save ($ productToSave );
222182
223- try {
224- $ this ->optionResource ->save ($ option );
225- } catch (\Exception $ e ) {
226- throw new CouldNotSaveException (__ ("The option couldn't be saved. " ), $ e );
227- }
228-
229- /** @var \Magento\Bundle\Api\Data\LinkInterface $linkedProduct */
230- foreach ($ linksToAdd as $ linkedProduct ) {
231- $ this ->linkManagement ->addChild ($ product , $ option ->getOptionId (), $ linkedProduct );
232- }
233- $ product ->setIsRelationsChanged (true );
234- return $ option ->getOptionId ();
183+ return $ savedOption ->getOptionId ();
235184 }
236185
237186 /**
@@ -325,16 +274,4 @@ private function compareLinks(array $firstArray, array $secondArray)
325274
326275 return $ result ;
327276 }
328-
329- /**
330- * Get MetadataPool instance
331- * @return MetadataPool
332- */
333- private function getMetadataPool ()
334- {
335- if (!$ this ->metadataPool ) {
336- $ this ->metadataPool = ObjectManager::getInstance ()->get (MetadataPool::class);
337- }
338- return $ this ->metadataPool ;
339- }
340277}
0 commit comments