/** * Fill product variations and save product * * @param ConfigurableProduct $variations * @return void */ protected function fillProductVariationsAndSave(ConfigurableProduct $variations) { $variationsData = $variations->getData(); $matrix = []; foreach ($variationsData['fields']['variations-matrix']['value'] as $variation) { $matrix[] = ['quantity_and_stock_status' => ['qty' => $variation['value']['qty']['value']]]; } $createProductPage = Factory::getPageFactory()->getCatalogProductNew(); $productForm = $createProductPage->getProductForm(); $productForm->openTab('variations'); /** @var \Magento\ConfigurableProduct\Test\Block\Adminhtml\Product\Edit\Tab\Super\Config $variationsTab */ $variationsTab = $productForm->getTabElement('variations'); $variationsTab->generateVariations(); $variationsTab->getVariationsBlock()->fillVariations($matrix); $createProductPage->getFormPageActions()->save($variations); }
/** * Prepare new product for update. * * @param ConfigurableProduct $initialProduct * @param ConfigurableProduct $product * @param string $attributeTypeAction * @return ConfigurableProduct */ protected function prepareProduct(ConfigurableProduct $initialProduct, ConfigurableProduct $product, $attributeTypeAction) { if ($attributeTypeAction == 'deleteAll') { $this->deletedAttributes = $initialProduct->getDataFieldConfig('configurable_attributes_data')['source']->getAttributes(); return $product; } $dataProduct = $product->getData(); $dataInitialProduct = $initialProduct->getData(); $oldMatrix = []; if ($attributeTypeAction == 'deleteLast') { array_pop($dataInitialProduct['configurable_attributes_data']['attributes_data']); $attributes = $initialProduct->getDataFieldConfig('configurable_attributes_data')['source']->getAttributes(); $this->deletedAttributes[] = array_pop($attributes); } $attributesData = $dataInitialProduct['configurable_attributes_data']['attributes_data']; if ($attributeTypeAction == 'addOptions') { $oldMatrix = $dataInitialProduct['configurable_attributes_data']['matrix']; $this->addOptions($attributesData, $dataProduct['configurable_attributes_data']['attributes_data']); } else { $this->addAttributes($attributesData, $dataProduct['configurable_attributes_data']['attributes_data']); } $dataProduct['configurable_attributes_data'] = ['attributes_data' => $attributesData, 'matrix' => $oldMatrix]; if ($product->hasData('category_ids')) { $dataProduct['category_ids']['category'] = $product->getDataFieldConfig('category_ids')['source']->getCategories()[0]; } return $this->fixtureFactory->createByCode('configurableProduct', ['data' => $dataProduct]); }
/** * Get variations data for curl * * @param ConfigurableProduct $fixture * @return array */ protected function _getVariationMatrix(ConfigurableProduct $fixture) { $config = $fixture->getDataConfig(); $variationData = $fixture->getData('fields/variations-matrix/value'); $curlData = []; $variationNumber = 0; foreach ($config['options'] as $attributeId => $options) { foreach ($options['id'] as $option) { foreach ($variationData[$variationNumber]['value'] as $fieldName => $fieldData) { if ($fieldName == 'qty') { $curlData[$option]['quantity_and_stock_status'][$fieldName] = $fieldData['value']; } else { $curlData[$option][$fieldName] = $fieldData['value']; } } if (!isset($curlData[$option]['weight']) && $fixture->getData('fields/weight/value')) { $curlData[$option]['weight'] = $fixture->getData('fields/weight/value'); } $curlData[$option]['configurable_attribute'] = '{"' . $config['attributes'][$attributeId]['code'] . '":"' . $option . '"}'; ++$variationNumber; } } return $curlData; }