Magento 2: praktik terbaik untuk menambah / menghapus Gambar produk secara terprogram?


18

Saya ingin mengunggah gambar ke produk yang ada. Gambar sudah masuk import_dir. Dan mereka perlu ditambahkan ke produk yang sudah ada di katalog.

Saya hanya dapat menemukan 2 cara bagaimana melakukannya.
1. Cara "praktik buruk" - menggunakan model produk\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

Kode

    /* 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. Cara "Praktek yang baik" - menggunakan 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

Kode

    $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);

Kekhawatiran:

  • Dalam 1 saya mendapatkan kesalahan, yang merupakan masalah yang diketahui

    Indeks tidak terdefinisi: media_type

  • In 2 terlalu rumit dan harus menjadi cara yang lebih mudah

Pertanyaan:

  • Adakah cara "praktik terbaik" untuk mengelola (menambah, menghapus, mengganti) gambar produk?
  • Mungkin ada cara dengan \ Magento \ CatalogImportExport \ Model \ Import \ Product

Jawaban:


3

Ini dapat dilakukan dengan menggunakan cara kedua Anda, kurang lebih seperti ini:

<?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);
}

}

$filePathharus menjadi jalur absolut - mungkin Anda bisa menggunakan konstanta BP.


sangat menyedihkan bahwa tidak ada cara yang lebih baik untuk menyelesaikannya, karena kata @JakubIlczuk - sangat terbatas. Tentang $entry->setMediaType('image');baris ini saya tidak begitu yakin, karena sejauh yang saya ingat itu menyebabkan saya melakukan kesalahan seperti itu perlu jenis "png" atau "jpg" (jadi pada akhirnya harus "image / png"). Tetapi sekali lagi, saya tidak yakin
Olga Zhe

Dalam Magento 2.1.1 tidak menyebabkan kesalahan seperti itu.
Bartosz Kubicki

Tidak ada alamat metode yang dihapus atau diganti. Hanya sebuah pengamatan.
Rooster242

0

setelah melihat hal-hal yang sama seperti Anda ternyata saya berada di tempat yang sama persis, dan tidak dapat menemukan cara yang lebih baik dari 2. ini. Dan 2 ini sangat terbatas. Dalam tes fungsional mereka menggunakan produk sederhana -> save () hal yang menyebabkan masalah lain (bagi saya pribadi, url_key sudah ada kesalahan). Sepertinya hanya metode ke-2 yang dapat digunakan, betapapun rumit dan membingungkannya. Tapi saya ingin tahu apakah dalam metode ke-2 Anda telah menemukan cara untuk mengatur gambar yang diunggah sebagai gambar kecil atau kecil?

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.