/** * @param MediaBackendModel $mediaBackendModel * @param Product $product * @return Product */ public function afterAfterSave(MediaBackendModel $mediaBackendModel, Product $product) { $mediaCollection = $this->getMediaEntriesDataCollection($product, $mediaBackendModel->getAttribute()); if (!empty($mediaCollection)) { $videoDataCollection = $this->collectVideoData($mediaCollection); $this->saveVideoData($videoDataCollection, $product->getStoreId()); $this->saveAdditionalStoreData($videoDataCollection); } return $product; }
/** * @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\\ModelResource\\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->model->setAttribute($attribute); $this->dataObject->setData(['attr_code' => 'attribute data']); $this->assertEquals(!$value, $this->model->validate($this->dataObject)); }
public function testAfterSaveDeleteFiles() { $storeId = 1; $storeIds = ['store_1' => 1, 'store_2' => 2]; $attributeCode = 'test_code'; $toDelete = [1]; $mediaPath = 'catalog/media'; $filePathToRemove = $mediaPath . '/file/path'; $attributeValue = ['images' => [['removed' => true, 'value_id' => 1, 'file' => 'file/path'], ['removed' => false, 'value_id' => 1, 'file' => 'file/path2']]]; $assignedImages = [['filepath' => 'path_to_image']]; $attributeMock = $this->getMockBuilder('Magento\\Eav\\Model\\Entity\\Attribute')->disableOriginalConstructor()->getMock(); $attributeMock->expects($this->once())->method('getAttributeCode')->will($this->returnValue($attributeCode)); $this->dataObject->expects($this->once())->method('getIsDuplicate')->will($this->returnValue(false)); $this->dataObject->expects($this->once())->method('isLockedAttribute')->will($this->returnValue(false)); $this->dataObject->setData($attributeCode, $attributeValue); $this->dataObject->setId(1); $this->dataObject->setStoreId($storeId); $this->dataObject->setStoreIds($storeIds); $productMock = $this->getMockBuilder('Magento\\Catalog\\Model\\Product')->disableOriginalConstructor()->setMethods(['getAssignedImages', '__wakeup'])->getMock(); $productMock->expects($this->any())->method('getAssignedImages')->will($this->returnValue($assignedImages)); $this->productFactory->expects($this->once())->method('create')->will($this->returnValue($productMock)); $this->resourceModel->expects($this->once())->method('deleteGallery')->with($toDelete); $this->mediaConfig->expects($this->once())->method('getBaseMediaPath')->will($this->returnValue($mediaPath)); $this->mediaDirectory->expects($this->once())->method('delete')->with($filePathToRemove); $this->model->setAttribute($attributeMock); $this->assertNull($this->model->afterSave($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->media->duplicateImageFromTmp($file); $productsData[$variationId]['media_gallery']['images'][$imageId]['file'] = $newFile; foreach (['small_image', 'thumbnail', 'image'] as $imageType) { if (isset($productsData[$variationId][$imageType]) && $productsData[$variationId][$imageType] == $file) { $productsData[$variationId][$imageType] = $newFile; } } } } return $productsData; }
/** * 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->media->duplicateImageFromTmp($file); $productsData[$variationId]['media_gallery']['images'][$imageId]['file'] = $newFile; foreach ($this->variationMediaAttributes->getMediaAttributes() as $attribute) { if (isset($productsData[$variationId][$attribute->getAttributeCode()]) && $productsData[$variationId][$attribute->getAttributeCode()] == $file) { $productsData[$variationId][$attribute->getAttributeCode()] = $newFile; } } } } return $productsData; }
/** * {@inheritdoc} */ public function afterSave($object) { $pluginInfo = $this->pluginList->getNext($this->subjectType, 'afterSave'); if (!$pluginInfo) { return parent::afterSave($object); } else { return $this->___callPlugins('afterSave', func_get_args(), $pluginInfo); } }
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')); }
/** * @dataProvider beforeSaveDataProvider * @param array $value */ public function testBeforeSave($value) { $attributeCode = 'attr_code'; $attribute = $this->getMock('Magento\\Eav\\Model\\Entity\\Attribute', ['getAttributeCode', 'getIsRequired', 'isValueEmpty', 'getIsUnique', 'getEntityType', '__wakeup'], [], '', false); $mediaAttributes = ['image' => $attribute, 'small_image' => $attribute, 'thumbnail' => $attribute]; $attribute->expects($this->any())->method('getAttributeCode')->will($this->returnValue($attributeCode)); $this->dataObject->expects($this->any())->method('getIsDuplicate')->will($this->returnValue(false)); $this->model->setAttribute($attribute); $this->dataObject->setData(['attr_code' => ['images' => $value]]); $this->dataObject->expects($this->any())->method('getMediaAttributes')->will($this->returnValue($mediaAttributes)); $this->model->beforeSave($this->dataObject); foreach ($this->dataObject['attr_code']['images'] as $imageType => $imageData) { if (isset($imageData['new_file'])) { $value[$imageType]['file'] = $imageData['file']; $value[$imageType]['new_file'] = $imageData['new_file']; } $this->assertEquals($value[$imageType], $imageData); } }
/** * Duplicates gallery db values * * @param \Magento\Catalog\Model\Product\Attribute\Backend\Media $object * @param array $newFiles * @param int $originalProductId * @param int $newProductId * @return $this */ public function duplicate($object, $newFiles, $originalProductId, $newProductId) { $select = $this->_getReadAdapter()->select()->from($this->getMainTable(), array('value_id', 'value'))->where('attribute_id = ?', $object->getAttribute()->getId())->where('entity_id = ?', $originalProductId); $valueIdMap = array(); // Duplicate main entries of gallery foreach ($this->_getReadAdapter()->fetchAll($select) as $row) { $data = array('attribute_id' => $object->getAttribute()->getId(), 'entity_id' => $newProductId, 'value' => isset($newFiles[$row['value_id']]) ? $newFiles[$row['value_id']] : $row['value']); $valueIdMap[$row['value_id']] = $this->insertGallery($data); } if (count($valueIdMap) == 0) { return $this; } // Duplicate per store gallery values $select = $this->_getReadAdapter()->select()->from($this->getTable(self::GALLERY_VALUE_TABLE))->where('value_id IN(?)', array_keys($valueIdMap)); foreach ($this->_getReadAdapter()->fetchAll($select) as $row) { $row['value_id'] = $valueIdMap[$row['value_id']]; $this->insertGalleryValueInStore($row); } return $this; }