Magento 2: Programlı olarak ürün resimleri eklemek / silmek için en iyi uygulama?


18

Mevcut ürünlere resim yüklemek istiyorum. Görüntüler var import_dir. Ve zaten katalogda bulunan ürüne eklenmeleri gerekiyor.

Bunu yapmanın sadece 2 yolunu bulabilirim.
1. "Kötü uygulama" yolu - ürün modelini kullanma\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

kod

    /* 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. "İyi uygulama" yolu - API kullanarak \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

kod

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

Endişeler:

  • In 1 Ben bir hata, alıyorum bilinen sorun

    Tanımsız dizin: media_type

  • In 2 yol çok karmaşıktır ve daha kolay bir yolu olmalı

Sorular:

  • Ürün resimlerini yönetmenin (ekleme, kaldırma, değiştirme) "en iyi uygulama" yolu var mı?
  • Belki \ Magento \ CatalogueImportExport \ Model \ Import \ Product ile bir yol var

Yanıtlar:


3

İkinci yolunuz kullanılarak yapılabilir, aşağı yukarı böyle:

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

}

$filePathmutlak bir yol olmalı - belki de sabitleri kullanabilirsiniz BP.


@JakubIlczuk'un dediği gibi çözmenin daha iyi bir yolu olmadığı üzücü. Bu $entry->setMediaType('image');çizgi hakkında pek emin değilim, çünkü hatırladığım kadarıyla bana bir tür "png" veya "jpg" gibi bir hataya neden oldu (bu yüzden sonunda "image / png" olmalıdır). Ama yine, emin değilim
Olga Zhe

Magento 2.1.1'de böyle bir hataya neden olmuyor.
Bartosz Kubicki

Her iki yöntem adresi de kaldırılmaz veya değiştirilmez. Sadece bir gözlem.
Rooster242

0

Görünüşe göre tam olarak aynı yerdeyim ve bu 2'den daha iyi bir yol bulamıyorum. Ve bu 2 son derece sınırlıdır. Fonksiyonel testlerde, diğer ürünlere neden olan basit ürün-> save () özelliğini kullanıyorlar (kişisel olarak, url_key zaten hata var). Sadece 2. yöntem kullanılabilir gibi görünüyor, ancak karmaşık ve kafa karıştırıcı görünüyor. Ama merak ediyorum 2. yöntemde yüklenen görüntüleri küçük resim veya küçük resim olarak ayarlamanın bir yolunu buldunuz mu?

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.