Magento 2: วิธีปฏิบัติที่ดีที่สุดในการเพิ่ม / ลบรูปภาพผลิตภัณฑ์โดยทางโปรแกรม?


18

ฉันต้องการอัปโหลดภาพไปยังผลิตภัณฑ์ที่มีอยู่ import_dirภาพที่อยู่ใน และพวกเขาจำเป็นต้องเพิ่มไปยังผลิตภัณฑ์ที่มีอยู่แล้วในแคตตาล็อก

ฉันสามารถหาวิธีทำได้ 2 วิธีเท่านั้น
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

  • ใน2เป็นวิธีที่ซับซ้อนเกินไปและควรเป็นวิธีที่ง่ายกว่า

คำถาม:

  • มีวิธีปฏิบัติที่ดีที่สุดในการจัดการ (เพิ่มลบเปลี่ยน) ภาพผลิตภัณฑ์หรือไม่
  • อาจมีวิธีกับ\ Magento \ CatalogImportExport \ Model \ Import \ Product

คำตอบ:


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ควรเป็นเส้นทางที่แน่นอน - บางทีคุณอาจใช้ค่าBPคงที่


มันน่าเศร้าที่ไม่มีวิธีที่ดีกว่านี้ในการแก้ปัญหาอีกต่อไปเพราะ @JakubIlczuk พูด - มันมีข้อ จำกัด อย่างมาก เกี่ยวกับ$entry->setMediaType('image');บรรทัดนี้ฉันไม่แน่ใจ cuz เท่าที่ฉันจำได้ว่ามันทำให้ฉันเกิดข้อผิดพลาดบางอย่างเช่นที่มันต้องการประเภท "png" หรือ "jpg" (ดังนั้นในที่สุดมันควรเป็น "image / png") แต่อีกครั้งฉันไม่แน่ใจ
Olga Zhe

ใน magento 2.1.1 มันไม่ก่อให้เกิดข้อผิดพลาดดังกล่าว
Bartosz Kubicki

ไม่มีวิธีการที่อยู่ลบหรือแทนที่ เพียงแค่การสังเกต
Rooster242

0

หลังจากดูสิ่งเดียวกับที่คุณเห็นได้ชัดฉันอยู่ในที่เดียวกันและไม่สามารถหาวิธีที่ดีกว่านี้ได้อีก 2 และ 2 นี้มี จำกัด มาก ในการทดสอบการใช้งานพวกเขากำลังใช้ผลิตภัณฑ์แบบง่าย> save () สิ่งที่ทำให้เกิดปัญหาอื่น ๆ (สำหรับฉันเป็นการส่วนตัวข้อผิดพลาด url_key มีอยู่แล้ว) ดูเหมือนว่าวิธีที่ 2 เท่านั้นที่สามารถใช้งานได้ แต่มีความซับซ้อนและทำให้เกิดความสับสน แต่ฉันสงสัยว่าในวิธีที่ 2 คุณได้พบวิธีตั้งรูปภาพที่อัปโหลดเป็นภาพย่อหรือภาพขนาดเล็กหรือไม่?

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.