/** * @dataProvider validateDataProvider * @param bool $value */ public function testValidate($value) { $attributeCode = 'attr_code'; $attribute = $this->getMock('Magento\\Eav\\Model\\Entity\\Attribute', ['getAttributeCode', 'getIsRequired', 'isValueEmpty', 'getIsUnique', 'getEntityType', '__wakeup'], [], '', false); $attributeEntity = $this->getMock('\\Magento\\Framework\\Model\\ResourceModel\\AbstractResourceAbstractEntity', ['checkAttributeUniqueValue']); $attribute->expects($this->any())->method('getAttributeCode')->will($this->returnValue($attributeCode)); $attribute->expects($this->any())->method('getIsRequired')->will($this->returnValue(true)); $attribute->expects($this->any())->method('isValueEmpty')->will($this->returnValue($value)); $attribute->expects($this->any())->method('getIsUnique')->will($this->returnValue(true)); $attribute->expects($this->any())->method('getEntityType')->will($this->returnValue($attributeEntity)); $attributeEntity->expects($this->any())->method('checkAttributeUniqueValue')->will($this->returnValue(true)); $this->attributeRepository->expects($this->once())->method('get')->with('media_gallery')->willReturn($attribute); $this->dataObject->setData(['attr_code' => 'attribute data']); $this->assertEquals(!$value, $this->model->validate($this->dataObject)); }
/** * Duplicate images for variations * * @param array $productsData * * @return array * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ public function duplicateImagesForVariations($productsData) { $imagesForCopy = []; foreach ($productsData as $variationId => $simpleProductData) { if (!isset($simpleProductData['media_gallery']['images'])) { continue; } foreach ($simpleProductData['media_gallery']['images'] as $imageId => $image) { $image['variation_id'] = $variationId; if (isset($imagesForCopy[$imageId][0])) { // skip duplicate image for first product unset($imagesForCopy[$imageId][0]); } $imagesForCopy[$imageId][] = $image; } } foreach ($imagesForCopy as $imageId => $variationImages) { foreach ($variationImages as $image) { $file = $image['file']; $variationId = $image['variation_id']; $newFile = $this->mediaGalleryProcessor->duplicateImageFromTmp($file); $productsData[$variationId]['media_gallery']['images'][$imageId]['file'] = $newFile; foreach ($this->mediaGalleryProcessor->getMediaAttributeCodes() as $attribute) { if (isset($productsData[$variationId][$attribute]) && $productsData[$variationId][$attribute] == $file) { $productsData[$variationId][$attribute] = $newFile; } } } } return $productsData; }
public function testSetMediaAttribute() { /** @var $product \Magento\Catalog\Model\Product */ $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\\Catalog\\Model\\Product'); $this->_model->setMediaAttribute($product, 'image', 'test1'); $this->assertEquals('test1', $product->getData('image')); $this->_model->setMediaAttribute($product, ['non-exist-image-attribute', 'small_image'], 'test'); $this->assertNull($product->getData('non-exist-image-attribute')); $this->assertEquals('test', $product->getData('small_image')); }
public function testSetMediaAttribute() { /** @var $product \Magento\Catalog\Model\Product */ $product = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\\Catalog\\Model\\Product'); $product->setMediaAttributes(['test_media1', 'test_media2', 'test_media3']); $this->_model->setMediaAttribute($product, 'test_media1', 'test1'); $this->assertEquals('test1', $product->getData('test_media1')); $this->_model->setMediaAttribute($product, ['test_media2', 'test_media3'], 'test'); $this->assertEquals('test', $product->getData('test_media2')); $this->assertEquals('test', $product->getData('test_media3')); }
public function testSaveExistingWithMediaGalleryEntries() { //update one entry, delete one entry $newEntries = [['id' => 5, "label" => "new_label_text", 'file' => 'filename1', 'position' => 10, 'disabled' => false, 'types' => ['image', 'small_image']]]; $existingMediaGallery = ['images' => [['value_id' => 5, "label" => "label_text", 'file' => 'filename1', 'position' => 10, 'disabled' => true], ['value_id' => 6, 'file' => 'filename2']]]; $expectedResult = [['id' => 5, 'value_id' => 5, "label" => "new_label_text", 'file' => 'filename1', 'position' => 10, 'disabled' => false, 'types' => ['image', 'small_image']], ['value_id' => 6, 'file' => 'filename2', 'removed' => true]]; $this->setupProductMocksForSave(); //media gallery data $this->productData['media_gallery_entries'] = $newEntries; $this->extensibleDataObjectConverterMock->expects($this->once())->method('toNestedArray')->will($this->returnValue($this->productData)); $this->initializedProductMock->setData('media_gallery', $existingMediaGallery); $this->initializedProductMock->expects($this->any())->method('getMediaAttributes')->willReturn(["image" => "filename1", "small_image" => "filename2"]); $this->mediaGalleryProcessor->expects($this->once())->method('clearMediaAttribute')->with($this->initializedProductMock, ['image', 'small_image']); $this->mediaGalleryProcessor->expects($this->once())->method('setMediaAttribute')->with($this->initializedProductMock, ['image', 'small_image'], 'filename1'); $this->initializedProductMock->expects($this->once())->method('getWebsiteIds')->willReturn([]); $this->model->save($this->productMock); $this->assertEquals($expectedResult, $this->initializedProductMock->getMediaGallery('images')); }
/** * Add image to media gallery * * @param string $file file path of image in file system * @param string|array $mediaAttribute code of attribute with type 'media_image', * leave blank if image should be only in gallery * @param boolean $move if true, it will move source file * @param boolean $exclude mark image as disabled in product page view * @return \Magento\Catalog\Model\Product */ public function addImageToMediaGallery($file, $mediaAttribute = null, $move = false, $exclude = true) { if ($this->hasGalleryAttribute()) { $this->mediaGalleryProcessor->addImage($this, $file, $mediaAttribute, $move, $exclude); } return $this; }
/** * @param ProductInterface $product * @param array $mediaGalleryEntries * @return $this * @throws InputException * @throws StateException * @SuppressWarnings(PHPMD.CyclomaticComplexity) */ protected function processMediaGallery(ProductInterface $product, $mediaGalleryEntries) { $existingMediaGallery = $product->getMediaGallery('images'); $newEntries = []; if (!empty($existingMediaGallery)) { $entriesById = []; foreach ($mediaGalleryEntries as $entry) { if (isset($entry['id'])) { $entry['value_id'] = $entry['id']; $entriesById[$entry['value_id']] = $entry; } else { $newEntries[] = $entry; } } foreach ($existingMediaGallery as $key => &$existingEntry) { if (isset($entriesById[$existingEntry['value_id']])) { $updatedEntry = $entriesById[$existingEntry['value_id']]; $existingMediaGallery[$key] = array_merge($existingEntry, $updatedEntry); } else { //set the removed flag $existingEntry['removed'] = true; } } $product->setData('media_gallery', ["images" => $existingMediaGallery]); } else { $newEntries = $mediaGalleryEntries; } $this->mediaGalleryProcessor->clearMediaAttribute($product, array_keys($product->getMediaAttributes())); $images = $product->getMediaGallery('images'); if ($images) { foreach ($images as $image) { if (!isset($image['removed']) && !empty($image['types'])) { $this->mediaGalleryProcessor->setMediaAttribute($product, $image['types'], $image['file']); } } } foreach ($newEntries as $newEntry) { if (!isset($newEntry['content'])) { throw new InputException(__('The image content is not valid.')); } /** @var ImageContentInterface $contentDataObject */ $contentDataObject = $this->contentFactory->create()->setName($newEntry['content'][ImageContentInterface::NAME])->setBase64EncodedData($newEntry['content'][ImageContentInterface::BASE64_ENCODED_DATA])->setType($newEntry['content'][ImageContentInterface::TYPE]); $newEntry['content'] = $contentDataObject; $this->processNewMediaGalleryEntry($product, $newEntry); } return $this; }