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. "अच्छा अभ्यास" तरीका - एपीआई का उपयोग करना \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 \ उत्पाद के साथ

जवाबों:


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


यह दुखद है कि इसे हल करने के लिए और अधिक अच्छे तरीके नहीं हैं, cuz @JakubIlczuk ने कहा - यह बहुत सीमित है। इस $entry->setMediaType('image');लाइन के बारे में मुझे बिल्कुल यकीन नहीं है, क्यूज जहाँ तक मुझे याद है कि यह मुझे एक त्रुटि का कारण बना, जैसे कि इसे "png" या "jpg" की आवश्यकता है (इसलिए अंत में इसे "image / png" होना चाहिए)। लेकिन फिर से, मुझे यकीन नहीं है
ओल्गा

Magento 2.1.1 में यह इस तरह की त्रुटि का कारण नहीं है।
बार्टोज़ कुबिकी

न तो विधि पते निकालें या प्रतिस्थापित करें। सिर्फ एक अवलोकन।
Rooster242

0

एक ही चीज़ों को देखने के बाद जैसा कि आप स्पष्ट रूप से मैं बिल्कुल उसी जगह पर हूँ, और फिर कोई बेहतर रास्ता नहीं मिल सकता है। यह 2. और यह 2 बेहद सीमित हैं। कार्यात्मक परीक्षणों में वे सरल उत्पाद का उपयोग कर रहे हैं-> बचत () चीज जो अन्य समस्याओं का कारण बनती है (मेरे लिए व्यक्तिगत रूप से, url_key में पहले से ही त्रुटि मौजूद है)। लगता है कि केवल 2 विधि का उपयोग किया जा सकता है, हालांकि जटिल और भ्रमित लगता है। लेकिन मुझे आश्चर्य है कि अगर दूसरी विधि में आपको अपलोड की गई छवियों को थंबनेल या छोटी छवि के रूप में सेट करने का कोई तरीका मिल गया है?

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.