/** * @param array $data * @param \Shopware\Models\Article\Article $article * @throws \Shopware\Components\Api\Exception\CustomValidationException * @return array */ private function prepareImageAssociatedData($data, ArticleModel $article) { if (!isset($data['images'])) { return $data; } $images = $article->getImages(); $position = 1; foreach ($data['images'] as &$imageData) { if (isset($imageData['id'])) { $image = $this->getManager() ->getRepository('Shopware\Models\Article\Image') ->find($imageData['id']); if (!$image instanceof \Shopware\Models\Article\Image) { throw new ApiException\CustomValidationException(sprintf("Image by id %s not found", $imageData['id'])); } } else { $image = new \Shopware\Models\Article\Image(); } if (isset($imageData['link'])) { $path = $this->load($imageData['link']); $file = new \Symfony\Component\HttpFoundation\File\File($path); $media = new \Shopware\Models\Media\Media(); $media->setAlbumId(-1); $media->setAlbum($this->getManager()->find('Shopware\Models\Media\Album', -1)); $media->setFile($file); $media->setDescription(''); $media->setCreated(new \DateTime()); $media->setUserId(0); try { //persist the model into the model manager $this->getManager()->persist($media); $this->getManager()->flush(); } catch (\Doctrine\ORM\ORMException $e) { throw new ApiException\CustomValidationException(sprintf("Some error occured while loading your image")); } $image->setMain(2); $image->setMedia($media); $image->setPosition($position); $image->setArticle($article); $position++; $image->setPath($media->getName()); $image->setExtension($media->getExtension()); } $image->fromArray($imageData); $images->add($image); } unset($data['images']); return $data; }
/** * Exports the images of the item */ protected function exportImages() { /** * @var Shopware\Models\Article\Image $Image * @var Shopware\Models\Media\Media $ImageMedia */ foreach ($this->SHOPWARE_Article->getImages() as $Image) { $ImageMedia = $Image->getMedia(); if (is_null($ImageMedia)) { PlentymarketsLogger::getInstance()->error('Export:Initial:Item:Image', 'The image with the id »' . $Image->getId() . '« could not be added to the item with the number »' . $this->SHOPWARE_Article->getMainDetail()->getNumber() . '« (no media associated)', 2850); continue; } try { if ('___VERSION___' !== Shopware::VERSION && version_compare(Shopware::VERSION, '5.1.0', '<')) { $fullpath = Shopware()->DocPath() . $ImageMedia->getPath(); } else { /** * @var \Shopware\Bundle\MediaBundle\MediaService $mediaService */ $mediaService = Shopware()->Container()->get('shopware_media.media_service'); $fullpath = $mediaService->getUrl($ImageMedia->getPath()); } } catch (Exception $E) { PlentymarketsLogger::getInstance()->error('Export:Initial:Item:Image', 'The image with the id »' . $Image->getId() . '« could not be added to the item with the number »' . $this->SHOPWARE_Article->getMainDetail()->getNumber() . '« (' . $E->getMessage() . ')', 2860); continue; } $Request_SetItemImages = new PlentySoapRequest_SetItemImages(); $Request_SetItemImages->Images = array(); $RequestObject_SetItemImagesImage = new PlentySoapRequestObject_SetItemImagesImage(); $RequestObject_SetItemImagesImage->ImageFileName = $Image->getPath(); $RequestObject_SetItemImagesImage->ImageFileData = base64_encode(file_get_contents($fullpath)); $RequestObject_SetItemImagesImage->ImageFileEnding = $Image->getExtension(); $RequestObject_SetItemImagesImage->ImageID = null; // int $RequestObject_SetItemImagesImage->ImageURL = null; // string $RequestObject_SetItemImagesImage->Position = $Image->getPosition(); $mappings = $Image->getMappings(); if (count($mappings)) { /** @var Shopware\Models\Article\Image\Mapping $mapping */ $mapping = $mappings->first(); $rules = $mapping->getRules(); if (count($rules)) { /** @var Shopware\Models\Article\Image\Rule $rule */ $rule = $rules->first(); $option = $rule->getOption(); $group = $option->getGroup(); // $Request_SetItemImages->ItemAttributeID = PlentymarketsMappingController::getAttributeGroupByShopwareID($group->getId()); $RequestObject_SetItemImagesImage->AttributeValueId = PlentymarketsMappingController::getAttributeOptionByShopwareID($option->getId()); } } $RequestObject_SetItemImagesImage->Names = array(); $RequestObject_SetItemImagesImageName = new PlentySoapRequestObject_SetItemImagesImageName(); if (!is_null(PlentymarketsConfig::getInstance()->getItemImageAltAttributeID()) && PlentymarketsConfig::getInstance()->getItemImageAltAttributeID() > 0 && PlentymarketsConfig::getInstance()->getItemImageAltAttributeID() <= 3) { // get the attribute number for alternative text from connector's settings $plenty_attributeID = PlentymarketsConfig::getInstance()->getItemImageAltAttributeID(); //check if the attribute value is set for the image if (method_exists($Image->getAttribute(), 'getAttribute' . $plenty_attributeID)) { // set the value of the attribute as alternative text for the image $RequestObject_SetItemImagesImageName->AlternativeText = $Image->getAttribute()->{getAttribute . $plenty_attributeID}(); // string } } $RequestObject_SetItemImagesImageName->DeleteName = false; // boolean $RequestObject_SetItemImagesImageName->Lang = 'de'; // string $RequestObject_SetItemImagesImageName->Name = $Image->getDescription(); // string $RequestObject_SetItemImagesImage->Names[] = $RequestObject_SetItemImagesImageName; // export the image title translations $image_NameTranslations = $this->getImageTitleTranslations($Image->getId()); foreach ($image_NameTranslations as $lang => $titleTranslation) { $RequestObject_SetItemImagesImageName = new PlentySoapRequestObject_SetItemImagesImageName(); $RequestObject_SetItemImagesImageName->DeleteName = false; // boolean $RequestObject_SetItemImagesImageName->Lang = $lang; // string $RequestObject_SetItemImagesImageName->Name = $titleTranslation; // string $RequestObject_SetItemImagesImage->Names[] = $RequestObject_SetItemImagesImageName; } // set the plenty store ids for references $RequestObject_SetItemImagesImage->References = array(); $plentyStoreIds = array(); /** @var Shopware\Models\Category\Category $Category */ foreach ($this->SHOPWARE_Article->getCategories() as $Category) { // Get the store for this category $rootId = PlentymarketsUtils::getRootIdByCategory($Category); $shops = PlentymarketsUtils::getShopIdByCategoryRootId($rootId); foreach ($shops as $shopId) { try { $plentyStoreId = PlentymarketsMappingController::getShopByShopwareID($shopId); if (!in_array($plentyStoreId, $plentyStoreIds)) { $plentyStoreIds[] = $plentyStoreId; } } catch (PlentymarketsMappingExceptionNotExistant $E) { continue; } } } foreach ($plentyStoreIds as $storeId) { $RequestObject_SetItemImagesImageReference = new PlentySoapRequestObject_SetItemImagesImageReference(); $RequestObject_SetItemImagesImageReference->DeleteReference = false; // boolean //$Enumeration_SetItemImagesImageReferenceType = new PlentySoapEnumeration_SetItemImagesImageReferenceType(); $RequestObject_SetItemImagesImageReference->ReferenceType = 'Mandant'; $RequestObject_SetItemImagesImageReference->ReferenceValue = $storeId; // int $RequestObject_SetItemImagesImage->References[] = $RequestObject_SetItemImagesImageReference; } $Request_SetItemImages->Images[] = $RequestObject_SetItemImagesImage; $Request_SetItemImages->ItemID = $this->PLENTY_itemID; // Do the request PlentymarketsSoapClient::getInstance()->SetItemImages($Request_SetItemImages); } }
/** * {@inheritDoc} */ public function getImages() { $this->__initializer__ && $this->__initializer__->__invoke($this, 'getImages', array()); return parent::getImages(); }
/** * Resolves the passed images array for the current variant. * An image can be assigned to a variant over a media id of an existing article image * or over the link property which can contain a image link. * This image will be added automatically to the article. * * @param $data * @param ArticleModel $article * @param Detail $variant * @return mixed * @throws \Shopware\Components\Api\Exception\CustomValidationException */ protected function prepareImageAssociation($data, ArticleModel $article, Detail $variant) { if (empty($data['images'])) { if ($variant->getImages()->count() > 0) { /**@var $image Image*/ foreach ($variant->getImages() as $image) { $mapping = $this->getVariantMappingOfImage($image, $variant); if ($mapping) { $this->getManager()->remove($mapping); } } } return $data; } $images = $this->checkDataReplacement($variant->getImages(), $data, 'images', true); foreach ($data['images'] as $imageData) { //check if a media id was passed. if (isset($imageData['mediaId'])) { //first check if the media object is already assigned to the article $image = $this->getAvailableMediaImage($article->getImages(), $imageData['mediaId']); //media image isn't assigned to the article? if (!$image) { //find the media object and convert it to an article image. /**@var $media MediaModel*/ $media = $this->getManager()->find('Shopware\\Models\\Media\\Media', (int) $imageData['mediaId']); if (!$media) { throw new ApiException\CustomValidationException(sprintf('Media by id %s not found', (int) $imageData['mediaId'])); } $image = $this->getArticleResource()->createNewArticleImage($article, $media); } } elseif (isset($imageData['link'])) { //check if an url passed and upload the passed image url and create a new article image. $media = $this->getMediaResource()->internalCreateMediaByFileLink($imageData['link']); $image = $this->getArticleResource()->createNewArticleImage($article, $media); } else { throw new ApiException\CustomValidationException("One of the passed variant images doesn't contains a mediaId or link property!"); } $variantImage = $this->createVariantImage($image, $variant); $this->createImageMappingForOptions($variant->getConfiguratorOptions(), $image); $images->add($variantImage); } $data['images'] = $images; $variant->setImages($images); return $data; }
/** * Resolves the passed images data to valid Shopware\Models\Article\Image * entities. * * @param array $data * @param \Shopware\Models\Article\Article $article * @throws \Shopware\Components\Api\Exception\CustomValidationException * @return array */ private function prepareImageAssociatedData($data, ArticleModel $article) { if (!isset($data['images'])) { return $data; } // remove assigned images if (empty($data['images'])) { $images = $article->getImages(); $images->clear(); unset($data['images']); return $data; } $position = 1; $images = $this->checkDataReplacement($article->getImages(), $data, 'images', false); foreach ($data['images'] as &$imageData) { /**@var $image Image */ $image = $this->getOneToManySubElement($images, $imageData, '\\Shopware\\Models\\Article\\Image'); if (isset($imageData['link'])) { /**@var $media MediaModel */ $media = $this->getMediaResource()->internalCreateMediaByFileLink($imageData['link']); $image = $this->updateArticleImageWithMedia($article, $image, $media); $image->setPosition($position); $position++; } elseif (!empty($imageData['mediaId'])) { $media = $this->getManager()->find('Shopware\\Models\\Media\\Media', (int) $imageData['mediaId']); if (!$media instanceof MediaModel) { throw new ApiException\CustomValidationException(sprintf("Media by mediaId %s not found", $imageData['mediaId'])); } $image = $this->updateArticleImageWithMedia($article, $image, $media); } $image->fromArray($imageData); // if image is set as main set other images to secondary if ($image->getMain() == 1) { /** @var $otherImage Image */ foreach ($images as $otherImage) { //only update existing images which are not the current processed image. //otherwise the main flag won't be changed. if ($otherImage->getId() !== $image->getId()) { $otherImage->setMain(2); } } } if (isset($imageData['options'])) { $this->createImageMappings($image, $article, $imageData['options']); } } $hasMain = $this->getCollectionElementByProperty($images, 'main', 1); if (!$hasMain) { $image = $images->get(0); $image->setMain(1); } unset($data['images']); return $data; }