/** * Create new product page * * @return \Magento\Framework\Controller\ResultInterface */ public function execute() { if (!$this->getRequest()->getParam('set')) { return $this->resultForwardFactory->create()->forward('noroute'); } $product = $this->productBuilder->build($this->getRequest()); $productData = $this->getRequest()->getPost('product'); if (!$productData) { $sessionData = $this->_session->getProductData(true); if (!empty($sessionData['product'])) { $productData = $sessionData['product']; } } if ($productData) { $stockData = isset($productData['stock_data']) ? $productData['stock_data'] : []; $productData['stock_data'] = $this->stockFilter->filter($stockData); $product = $this->getInitializationHelper()->initializeFromData($product, $productData); } $this->_eventManager->dispatch('catalog_product_new_action', ['product' => $product]); /** @var \Magento\Backend\Model\View\Result\Page $resultPage */ $resultPage = $this->resultPageFactory->create(); if ($this->getRequest()->getParam('popup')) { $resultPage->addHandle(['popup', 'catalog_product_' . $product->getTypeId()]); } else { $resultPage->addHandle(['catalog_product_' . $product->getTypeId()]); $resultPage->setActiveMenu('Magento_Catalog::catalog_products'); $resultPage->getConfig()->getTitle()->prepend(__('Products')); $resultPage->getConfig()->getTitle()->prepend(__('New Product')); } $block = $resultPage->getLayout()->getBlock('catalog.wysiwyg.js'); if ($block) { $block->setStoreId($product->getStoreId()); } return $resultPage; }
/** * Create new product page * * @return void */ public function execute() { if (!$this->getRequest()->getParam('set')) { $this->_forward('noroute'); return; } $this->_title->add(__('Products')); $product = $this->productBuilder->build($this->getRequest()); $productData = $this->getRequest()->getPost('product'); if ($productData) { $stockData = isset($productData['stock_data']) ? $productData['stock_data'] : array(); $productData['stock_data'] = $this->stockFilter->filter($stockData); $product->addData($productData); } $this->_title->add(__('New Product')); $this->_eventManager->dispatch('catalog_product_new_action', array('product' => $product)); if ($this->getRequest()->getParam('popup')) { $this->_view->loadLayout(array('popup', strtolower($this->_request->getFullActionName()), 'catalog_product_' . $product->getTypeId())); } else { $this->_view->loadLayout(array('default', strtolower($this->_request->getFullActionName()), 'catalog_product_' . $product->getTypeId())); $this->_setActiveMenu('Magento_Catalog::catalog_products'); } $this->_view->getLayout()->getBlock('head')->setCanLoadExtJs(true); $block = $this->_view->getLayout()->getBlock('catalog.wysiwyg.js'); if ($block) { $block->setStoreId($product->getStoreId()); } $this->_view->renderLayout(); }
/** * @param array $inputStockData * @param array $outputStockData * * @covers \Magento\Catalog\Controller\Adminhtml\Product\Initialization\StockDataFilter::filter * @dataProvider filterDataProvider */ public function testFilter(array $inputStockData, array $outputStockData) { if (isset($inputStockData['use_config_manage_stock']) && $inputStockData['use_config_manage_stock'] === 1) { $this->stockConfiguration->expects($this->once())->method('getManageStock')->will($this->returnValue($outputStockData['manage_stock'])); } $this->assertEquals($outputStockData, $this->stockDataFilter->filter($inputStockData)); }
/** * @covers \Magento\Catalog\Controller\Adminhtml\Product\Initialization\Helper::initialize * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function testInitialize() { $this->websiteMock->expects($this->once())->method('getId')->willReturn($this->websiteId); $this->storeMock->expects($this->once())->method('getWebsite')->willReturn($this->websiteMock); $this->storeManagerMock->expects($this->once())->method('getStore')->with(true)->willReturn($this->storeMock); $this->customOptionMock->expects($this->once())->method('setProductSku'); $this->customOptionMock->expects($this->once())->method('setOptionId'); $optionsData = ['option1' => ['is_delete' => true, 'name' => 'name1', 'price' => 'price1'], 'option2' => ['is_delete' => false, 'name' => 'name1', 'price' => 'price1']]; $productData = ['stock_data' => ['stock_data'], 'options' => $optionsData]; $attributeNonDate = $this->getMockBuilder(\Magento\Catalog\Model\ResourceModel\Eav\Attribute::class)->disableOriginalConstructor()->getMock(); $attributeDate = $this->getMockBuilder(\Magento\Catalog\Model\ResourceModel\Eav\Attribute::class)->disableOriginalConstructor()->getMock(); $attributeNonDateBackEnd = $this->getMockBuilder(\Magento\Eav\Model\Entity\Attribute\Backend\DefaultBackend::class)->disableOriginalConstructor()->getMock(); $attributeDateBackEnd = $this->getMockBuilder(\Magento\Eav\Model\Entity\Attribute\Backend\Datetime::class)->disableOriginalConstructor()->getMock(); $attributeNonDate->expects($this->any())->method('getBackend')->willReturn($attributeNonDateBackEnd); $attributeDate->expects($this->any())->method('getBackend')->willReturn($attributeDateBackEnd); $this->productMock->expects($this->any())->method('getProductLinks')->willReturn([]); $attributeNonDateBackEnd->expects($this->any())->method('getType')->willReturn('non-datetime'); $attributeDateBackEnd->expects($this->any())->method('getType')->willReturn('datetime'); $attributesArray = [$attributeNonDate, $attributeDate]; $useDefaults = ['attributeCode1', 'attributeCode2']; $this->requestMock->expects($this->at(0))->method('getPost')->with('product')->willReturn($productData); $this->requestMock->expects($this->at(1))->method('getPost')->with('use_default')->willReturn($useDefaults); $this->linkResolverMock->expects($this->once())->method('getLinks')->willReturn([]); $this->stockFilterMock->expects($this->once())->method('filter')->with(['stock_data'])->willReturn(['stock_data']); $this->storeManagerMock->expects($this->once())->method('hasSingleStore')->willReturn(true); $this->productMock->expects($this->once())->method('isLockedAttribute')->with('media')->willReturn(true); $this->productMock->expects($this->once())->method('unlockAttribute')->with('media'); $this->productMock->expects($this->any())->method('getProductLinks')->willReturn([]); $this->productMock->expects($this->once())->method('lockAttribute')->with('media'); $this->productMock->expects($this->once())->method('getAttributes')->willReturn($attributesArray); $productData['category_ids'] = []; $productData['website_ids'] = []; unset($productData['options']); $this->productMock->expects($this->once())->method('addData')->with($productData); $this->productMock->expects($this->once())->method('getSku')->willReturn('sku'); $this->productMock->expects($this->once())->method('setWebsiteIds')->with([$this->websiteId]); $this->productMock->expects($this->any())->method('getOptionsReadOnly')->willReturn(false); $this->customOptionFactoryMock->expects($this->any())->method('create')->with(['data' => $optionsData['option2']])->willReturn($this->customOptionMock); $this->productMock->expects($this->once())->method('setOptions')->with([$this->customOptionMock]); $this->assertEquals($this->productMock, $this->helper->initialize($this->productMock)); }
/** * Initialize product from data * * @param \Magento\Catalog\Model\Product $product * @param array $productData * @return \Magento\Catalog\Model\Product * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function initializeFromData(\Magento\Catalog\Model\Product $product, array $productData) { unset($productData['custom_attributes']); unset($productData['extension_attributes']); if ($productData) { $stockData = isset($productData['stock_data']) ? $productData['stock_data'] : []; $productData['stock_data'] = $this->stockFilter->filter($stockData); } $productData = $this->normalize($productData); if (!empty($productData['is_downloadable'])) { $productData['product_has_weight'] = 0; } foreach (['category_ids', 'website_ids'] as $field) { if (!isset($productData[$field])) { $productData[$field] = []; } } foreach ($productData['website_ids'] as $websiteId => $checkboxValue) { if (!$checkboxValue) { unset($productData['website_ids'][$websiteId]); } } $wasLockedMedia = false; if ($product->isLockedAttribute('media')) { $product->unlockAttribute('media'); $wasLockedMedia = true; } $dateFieldFilters = []; $attributes = $product->getAttributes(); foreach ($attributes as $attrKey => $attribute) { if ($attribute->getBackend()->getType() == 'datetime') { if (array_key_exists($attrKey, $productData) && $productData[$attrKey] != '') { $dateFieldFilters[$attrKey] = $this->getDateTimeFilter(); } } } $inputFilter = new \Zend_Filter_Input($dateFieldFilters, [], $productData); $productData = $inputFilter->getUnescaped(); if (isset($productData['options'])) { $productOptions = $productData['options']; unset($productData['options']); } else { $productOptions = []; } $product->addData($productData); if ($wasLockedMedia) { $product->lockAttribute('media'); } if ($this->storeManager->hasSingleStore() && empty($product->getWebsiteIds())) { $product->setWebsiteIds([$this->storeManager->getStore(true)->getWebsite()->getId()]); } /** * Check "Use Default Value" checkboxes values */ $useDefaults = (array) $this->request->getPost('use_default', []); foreach ($useDefaults as $attributeCode => $useDefaultState) { if ($useDefaultState) { $product->setData($attributeCode, null); } } $product = $this->setProductLinks($product); /** * Initialize product options */ if ($productOptions && !$product->getOptionsReadonly()) { // mark custom options that should to fall back to default value $options = $this->mergeProductOptions($productOptions, $this->request->getPost('options_use_default')); $customOptions = []; foreach ($options as $customOptionData) { if (empty($customOptionData['is_delete'])) { if (isset($customOptionData['values'])) { $customOptionData['values'] = array_filter($customOptionData['values'], function ($valueData) { return empty($valueData['is_delete']); }); } $customOption = $this->getCustomOptionFactory()->create(['data' => $customOptionData]); $customOption->setProductSku($product->getSku()); $customOption->setOptionId(null); $customOptions[] = $customOption; } } $product->setOptions($customOptions); } $product->setCanSaveCustomOptions(!empty($productData['affect_product_custom_options']) && !$product->getOptionsReadonly()); return $product; }
/** * Initialize product before saving * * @param \Magento\Catalog\Model\Product $product * @return \Magento\Catalog\Model\Product * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) * @SuppressWarnings(PHPMD.ExcessiveMethodLength) */ public function initialize(\Magento\Catalog\Model\Product $product) { $productData = $this->request->getPost('product'); unset($productData['custom_attributes']); unset($productData['extension_attributes']); if ($productData) { $stockData = isset($productData['stock_data']) ? $productData['stock_data'] : []; $productData['stock_data'] = $this->stockFilter->filter($stockData); } foreach (['category_ids', 'website_ids'] as $field) { if (!isset($productData[$field])) { $productData[$field] = []; } } $wasLockedMedia = false; if ($product->isLockedAttribute('media')) { $product->unlockAttribute('media'); $wasLockedMedia = true; } $dateFieldFilters = []; $attributes = $product->getAttributes(); foreach ($attributes as $attrKey => $attribute) { if ($attribute->getBackend()->getType() == 'datetime') { if (array_key_exists($attrKey, $productData) && $productData[$attrKey] != '') { $dateFieldFilters[$attrKey] = $this->dateFilter; } } } $inputFilter = new \Zend_Filter_Input($dateFieldFilters, [], $productData); $productData = $inputFilter->getUnescaped(); $product->addData($productData); if ($wasLockedMedia) { $product->lockAttribute('media'); } if ($this->storeManager->hasSingleStore()) { $product->setWebsiteIds([$this->storeManager->getStore(true)->getWebsite()->getId()]); } /** * Check "Use Default Value" checkboxes values */ $useDefaults = $this->request->getPost('use_default'); if ($useDefaults) { foreach ($useDefaults as $attributeCode) { $product->setData($attributeCode, false); } } $links = $this->request->getPost('links'); $links = is_array($links) ? $links : []; $linkTypes = ['related', 'upsell', 'crosssell']; foreach ($linkTypes as $type) { if (isset($links[$type])) { $links[$type] = $this->jsHelper->decodeGridSerializedInput($links[$type]); } } $product = $this->productLinks->initializeLinks($product, $links); $productLinks = $product->getProductLinks(); $linkTypes = ['related' => $product->getRelatedReadonly(), 'upsell' => $product->getUpsellReadonly(), 'crosssell' => $product->getCrosssellReadonly()]; foreach ($linkTypes as $linkType => $readonly) { if (isset($links[$linkType]) && !$readonly) { foreach ($links[$linkType] as $linkId => $linkData) { $linkProduct = $this->productRepository->getById($linkId); $link = $this->productLinkFactory->create(); $link->setSku($product->getSku())->setLinkedProductSku($linkProduct->getSku())->setLinkType($linkType)->setPosition(isset($linkData['position']) ? (int) $linkData['position'] : 0); $productLinks[] = $link; } } } $product->setProductLinks($productLinks); /** * Initialize product options */ if (isset($productData['options']) && !$product->getOptionsReadonly()) { // mark custom options that should to fall back to default value $options = $this->mergeProductOptions($productData['options'], $this->request->getPost('options_use_default')); $customOptions = []; foreach ($options as $customOptionData) { if (!(bool) $customOptionData['is_delete']) { $customOption = $this->customOptionFactory->create(['data' => $customOptionData]); $customOption->setProductSku($product->getSku()); $customOption->setOptionId(null); $customOptions[] = $customOption; } } $product->setOptions($customOptions); } $product->setCanSaveCustomOptions((bool) $this->request->getPost('affect_product_custom_options') && !$product->getOptionsReadonly()); return $product; }
/** * @param array $inputStockData * @param array $outputStockData * * @covers Magento\Catalog\Controller\Adminhtml\Product\Initialization\StockDataFilter::filter * @dataProvider filterDataProvider */ public function testFilter(array $inputStockData, array $outputStockData) { $this->assertEquals($outputStockData, $this->stockDataFilter->filter($inputStockData)); }