마 젠토 2 : 프로그래밍 방식으로 제품 이미지를 추가 / 삭제하는 모범 사례?


18

기존 제품에 이미지를 업로드하고 싶습니다. 이미지는입니다 import_dir. 그리고 카탈로그에 이미 존재하는 제품에 추가해야합니다.

나는 그것을하는 두 가지 방법 만 찾을 수 있습니다.
1. "나쁜 습관"방식-제품 모델 사용\Magento\Catalog\Model\Product::addImageToMediaGallery

1. Copy the images from `import_dir` to `pub/media/tmp`
2. Add the images to the product
3. Save product

암호

    /* copy files from import_dir to pub/media/tmp */

    /** @var \Magento\Catalog\Api\Data\ProductInterface $product */
    /* Init media gallery */
    $mediaGalleryEntries = $product->getMediaGalleryEntries();
    if (empty($mediaGalleryEntries) === true){
        $product->setMediaGalleryEntries([]);
    }

    /* Add an image to the product's gallery */
    $product->addImageToMediaGallery(
        $filePathFromTmpDir,
        [
          "image",
          "small_image",
          "thumbnail",
          "swatch_image" 
        ],
        $moveImage,
        $disableImage
    );

    /* Save */
    $this->_productRepository->save($product);

2. "모범 사례"방식-API 사용 \Magento\Catalog\Api\ProductAttributeMediaGalleryManagementInterface::create

1. Create image content object via **\Magento\Framework\Api\Data\ImageContentInterfaceFactory**
2. Create image object via **\Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterfaceFactory**
3. Create an image via API

암호

    $imageContent = $this->_imageContentInterfaceFactory->create()
        ->setBase64EncodedData(base64_encode(file_get_contents($filePathImportDir)))
        ->setType($this->_mime->getMimeType($filePathImportDir))
        ->setName($file_name);

    $newImage = $this->_productAttributeMediaGalleryEntryInterfaceFactory->create()
        ->setMediaType(\Magento\Catalog\Model\Product\Attribute\Backend\Media\ImageEntryConverter::MEDIA_TYPE_CODE)
        ->setFile($filePathImportDir)
        ->setDisabled($disableImage)
        ->setContent($imageContent)
        ->setLabel('label');

    $this->_productAttributeMediaGalleryManagement->create($product->getSku(), $newImage);

우려 사항 :

  • 에서 1 나는 오류, 받고 있어요 알려진 문제

    정의되지 않은 인덱스 : media_type

  • 에서 너무 복잡하고 그것은 쉬운 방법이어야한다

질문 :

  • 제품 이미지를 관리 (추가, 제거, 교체)하는 "모범 사례"방법이 있습니까?
  • 어쩌면있는 방법이 \ 젠토 \ CatalogImportExport \ 모델 \ 가져 오기 \ 제품

답변:


3

다음과 같이 두 번째 방법으로 수행 할 수 있습니다.

<?php


namespace [vendor]\[moduleName]\Model\Adminhtml\Product\MediaGallery;

use \Magento\Catalog\Model\Product\Gallery\EntryFactory;
use \Magento\Catalog\Model\Product\Gallery\GalleryManagement;
use \Magento\Framework\Api\ImageContentFactory;

{

/**
 * @var \Magento\Catalog\Model\Product\Gallery\EntryFactory
 */
private $mediaGalleryEntryFactory;


/**
 * @var \Magento\Catalog\Model\Product\Gallery\GalleryManagement
 */
private $mediaGalleryManagement;


/**
 * @var \Magento\Framework\Api\ImageContentFactory
 */
private $imageContentFactory;


/**
 * @param \Magento\Catalog\Model\Product\Gallery\EntryFactory $mediaGalleryEntryFactory
 * @param \Magento\Catalog\Model\Product\Gallery\GalleryManagement $mediaGalleryManagement
 * @param \Magento\Framework\Api\ImageContentFactory $imageContentFactory
 */
public function __construct
(
    EntryFactory $mediaGalleryEntryFactory,
    GalleryManagement $mediaGalleryManagement,
    ImageContentFactory $imageContentFactory
)
{
    $this->mediaGalleryEntryFactory = $mediaGalleryEntryFactory;
    $this->mediaGalleryManagement = $mediaGalleryManagement;
    $this->imageContentFactory = $imageContentFactory;
}


/**
 * @param string $filePath
 * @param string $sku
 */
public function processMediaGalleryEntry($filePath, $sku)
{
    $entry = $this->mediaGalleryEntryFactory->create();

    $entry->setFile($filePath);
    $entry->setMediaType('image');
    $entry->setDisabled(false);
    $entry->setTypes(['thumbnail', 'image', 'small_image']);

    $imageContent = $this->imageContentFactory->create();
    $imageContent
        ->setType(mime_content_type($filePath))
        ->setName('test')
        ->setBase64EncodedData(base64_encode(file_get_contents($filePath)));

    $entry->setContent($imageContent);

    $this->mediaGalleryManagement->create($sku, $entry);
}

}

$filePath절대 경로 여야합니다. 아마도 constans를 사용할 수 있습니다 BP.


@JakubIlczuk가 말한 것처럼 cuz를 해결하는 더 좋은 방법이 더 이상 없다는 것은 슬픈 일입니다. 매우 제한적입니다. 이 $entry->setMediaType('image');줄에 대해 잘 모르겠습니다. 내가 기억하는 한 "png"또는 "jpg"유형과 같은 오류가 발생했습니다. 결국 "image / png"여야합니다. 그러나 다시, 나는 확실하지 않다
Olga Zhe

magento 2.1.1에서는 이러한 오류가 발생하지 않습니다.
Bartosz Kubicki

메소드 주소는 제거하거나 대체하지 않습니다. 단지 관찰.
Rooster242

0

당신과 똑같은 것을 본 후에는 분명히 같은 장소에 있고,이 2보다 더 좋은 방법을 찾을 수 없습니다. 그리고이 2는 매우 제한적입니다. 기능 테스트에서 그들은 다른 제품을 일으키는 간단한 product-> save ()를 사용하고 있습니다 (개인적으로 url_key는 이미 오류가 있습니다). 두 번째 방법 만 사용할 수 있지만 복잡하고 혼란스럽게 보입니다. 그러나 두 번째 방법으로 업로드 된 이미지를 축소판 또는 작은 이미지로 설정하는 방법을 찾았는지 궁금합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.