public function getMediaAttributes() { $expected = []; $mediaAttributes = $this->setupMediaAttributes(); foreach ($mediaAttributes as $mediaAttribute) { $expected[$mediaAttribute->getAttributeCode()] = $mediaAttribute; } $this->assertEquals($expected, $this->model->getMediaAttributes()); }
/** * {@inheritdoc} */ public function getMediaAttributes() { $pluginInfo = $this->pluginList->getNext($this->subjectType, 'getMediaAttributes'); if (!$pluginInfo) { return parent::getMediaAttributes(); } else { return $this->___callPlugins('getMediaAttributes', func_get_args(), $pluginInfo); } }
public function testGetMediaAttributes() { $model = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create('Magento\\Catalog\\Model\\Product', ['data' => ['media_attributes' => 'test']]); $this->assertEquals('test', $model->getMediaAttributes()); $attributes = $this->_model->getMediaAttributes(); $this->assertArrayHasKey('image', $attributes); $this->assertArrayHasKey('small_image', $attributes); $this->assertArrayHasKey('thumbnail', $attributes); $this->assertInstanceOf('Magento\\Catalog\\Model\\ResourceModel\\Eav\\Attribute', $attributes['image']); }
/** * Set media attribute value * * @param \Magento\Catalog\Model\Product $product * @param string|string[] $mediaAttribute * @param string $value * @return $this */ public function setMediaAttribute(\Magento\Catalog\Model\Product $product, $mediaAttribute, $value) { $mediaAttributeCodes = array_keys($product->getMediaAttributes()); if (is_array($mediaAttribute)) { foreach ($mediaAttribute as $atttribute) { if (in_array($atttribute, $mediaAttributeCodes)) { $product->setData($atttribute, $value); } } } elseif (in_array($mediaAttribute, $mediaAttributeCodes)) { $product->setData($mediaAttribute, $value); } return $this; }
/** * @param Product $object * @return Product * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.NPathComplexity) */ public function beforeSave($object) { $attrCode = $this->getAttribute()->getAttributeCode(); $value = $object->getData($attrCode); if (!is_array($value) || !isset($value['images'])) { return $object; } if (!is_array($value['images']) && strlen($value['images']) > 0) { $value['images'] = $this->jsonHelper->jsonDecode($value['images']); } if (!is_array($value['images'])) { $value['images'] = []; } $clearImages = []; $newImages = []; $existImages = []; if ($object->getIsDuplicate() != true) { foreach ($value['images'] as &$image) { if (!empty($image['removed'])) { $clearImages[] = $image['file']; } elseif (empty($image['value_id'])) { $newFile = $this->moveImageFromTmp($image['file']); $image['new_file'] = $newFile; $newImages[$image['file']] = $image; $image['file'] = $newFile; } else { $existImages[$image['file']] = $image; } } } else { // For duplicating we need copy original images. $duplicate = []; foreach ($value['images'] as &$image) { if (empty($image['value_id'])) { continue; } $duplicate[$image['value_id']] = $this->copyImage($image['file']); $image['new_file'] = $duplicate[$image['value_id']]; $newImages[$image['file']] = $image; } $value['duplicate'] = $duplicate; } foreach ($object->getMediaAttributes() as $mediaAttribute) { $mediaAttrCode = $mediaAttribute->getAttributeCode(); $attrData = $object->getData($mediaAttrCode); if (in_array($attrData, $clearImages)) { $object->setData($mediaAttrCode, 'no_selection'); } if (in_array($attrData, array_keys($newImages))) { $object->setData($mediaAttrCode, $newImages[$attrData]['new_file']); $object->setData($mediaAttrCode . '_label', $newImages[$attrData]['label']); } if (in_array($attrData, array_keys($existImages))) { $object->setData($mediaAttrCode . '_label', $existImages[$attrData]['label']); } } $object->setData($attrCode, $value); return $object; }
/** * @param string $entityType * @param \Magento\Catalog\Model\Product $product * @return \Magento\Catalog\Model\Product * @SuppressWarnings(PHPMD.CyclomaticComplexity) * @SuppressWarnings(PHPMD.UnusedFormalParameter) * @SuppressWarnings(PHPMD.NPathComplexity) */ public function execute($entityType, $product) { $attrCode = $this->getAttribute()->getAttributeCode(); $value = $product->getData($attrCode); if (!is_array($value) || !isset($value['images'])) { return $product; } if (!is_array($value['images']) && strlen($value['images']) > 0) { $value['images'] = $this->jsonHelper->jsonDecode($value['images']); } if (!is_array($value['images'])) { $value['images'] = []; } $clearImages = []; $newImages = []; $existImages = []; if ($product->getIsDuplicate() != true) { foreach ($value['images'] as &$image) { if (!empty($image['removed'])) { $clearImages[] = $image['file']; } elseif (empty($image['value_id'])) { $newFile = $this->moveImageFromTmp($image['file']); $image['new_file'] = $newFile; $newImages[$image['file']] = $image; $image['file'] = $newFile; } else { $existImages[$image['file']] = $image; } } } else { // For duplicating we need copy original images. $duplicate = []; foreach ($value['images'] as &$image) { if (empty($image['value_id']) || !empty($image['removed'])) { continue; } $duplicate[$image['value_id']] = $this->copyImage($image['file']); $image['new_file'] = $duplicate[$image['value_id']]; $newImages[$image['file']] = $image; } $value['duplicate'] = $duplicate; } /* @var $mediaAttribute \Magento\Catalog\Api\Data\ProductAttributeInterface */ foreach ($product->getMediaAttributes() as $mediaAttribute) { $mediaAttrCode = $mediaAttribute->getAttributeCode(); $attrData = $product->getData($mediaAttrCode); if (in_array($attrData, $clearImages)) { $product->setData($mediaAttrCode, 'no_selection'); } if (in_array($attrData, array_keys($newImages))) { $product->setData($mediaAttrCode, $newImages[$attrData]['new_file']); $product->setData($mediaAttrCode . '_label', $newImages[$attrData]['label']); } if (in_array($attrData, array_keys($existImages))) { $product->setData($mediaAttrCode . '_label', $existImages[$attrData]['label']); } $product->addAttributeUpdate($mediaAttrCode, $product->getData($mediaAttrCode), $product->getStoreId()); } $product->setData($attrCode, $value); if ($product->getIsDuplicate() == true) { $this->duplicate($product); return $product; } if (!is_array($value) || !isset($value['images']) || $product->isLockedAttribute($attrCode)) { return $product; } $this->processDeletedImages($product, $value['images']); $this->processNewAndExistingImages($product, $value['images']); $product->setData($attrCode, $value); return $product; }
/** * Retrieve assoc array that contains media attribute values of the given product * * @param Product $product * @return array */ protected function getMediaAttributeValues(Product $product) { $mediaAttributeCodes = array_keys($product->getMediaAttributes()); $mediaAttributeValues = array(); foreach ($mediaAttributeCodes as $attributeCode) { $mediaAttributeValues[$attributeCode] = $product->getData($attributeCode); } return $mediaAttributeValues; }