Example #1
0
    /**
     * @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();
 }
Example #4
0
 /**
  * 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;
 }
Example #5
0
 /**
  * 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;
 }