Добавить изображение base64 к продукту - PullRequest
0 голосов
/ 20 сентября 2018

Имея экземпляр $ product и изображение $ base64, как я могу установить его уменьшенное изображение?

В настоящее время я создаю сгруппированный продукт через пользовательский API в Magento (API_v2).

Мое приложение отправляет запрос SOAP со всей необходимой мне информацией:

  1. Имя
  2. Sku
  3. StoreURL
  4. Описание
  5. Image1 (Base64)
  6. Image2 (Base64)
  7. Некоторые пользовательские атрибуты
  8. Массив с данными для простых продуктов

В новой конечной точке используютсяnew Mage_Catalog_Model_Product(), затем я вручную вызываю несколько ->setAttributeName(value), а затем, наконец, -save().

Делая это через Admin Painel, изображение сохраняется внутри ./media/catalog/product/b/o/image.jpg, но я не думаю, что путь жестко закодирован.

Я знаю, что метод $product->setThumbnail($image) существует среди setBaseImage() и setSmallImage(), но у меня возникают проблемы с передачей аргумента $image.


Абсолютно необходимо загрузить мой base64 в CDN перед его сохранением?

Можно ли сохранить его локальнокаким-то образом загрузить программно?

1 Ответ

0 голосов
/ 21 сентября 2018

взгляните на этот метод API ('product_media.create') из ядра magento.Это именно то, что вы стремитесь достичь.

public function create($productId, $data, $store = null, $identifierType = null)
{
    $data = $this->_prepareImageData($data);

    $product = $this->_initProduct($productId, $store, $identifierType);

    $gallery = $this->_getGalleryAttribute($product);

    if (!isset($data['file']) || !isset($data['file']['mime']) || !isset($data['file']['content'])) {
        $this->_fault('data_invalid', Mage::helper('catalog')->__('The image is not specified.'));
    }

    if (!isset($this->_mimeTypes[$data['file']['mime']])) {
        $this->_fault('data_invalid', Mage::helper('catalog')->__('Invalid image type.'));
    }

    $fileContent = @base64_decode($data['file']['content'], true);
    if (!$fileContent) {
        $this->_fault('data_invalid', Mage::helper('catalog')->__('The image contents is not valid base64 data.'));
    }

    unset($data['file']['content']);

    $tmpDirectory = Mage::getBaseDir('var') . DS . 'api' . DS . $this->_getSession()->getSessionId();

    if (isset($data['file']['name']) && $data['file']['name']) {
        $fileName  = $data['file']['name'];
    } else {
        $fileName  = 'image';
    }
    $fileName .= '.' . $this->_mimeTypes[$data['file']['mime']];

    $ioAdapter = new Varien_Io_File();
    try {
        // Create temporary directory for api
        $ioAdapter->checkAndCreateFolder($tmpDirectory);
        $ioAdapter->open(array('path'=>$tmpDirectory));
        // Write image file
        $ioAdapter->write($fileName, $fileContent, 0666);
        unset($fileContent);

        // try to create Image object - it fails with Exception if image is not supported
        try {
            new Varien_Image($tmpDirectory . DS . $fileName);
        } catch (Exception $e) {
            // Remove temporary directory
            $ioAdapter->rmdir($tmpDirectory, true);

            throw new Mage_Core_Exception($e->getMessage());
        }

        // Adding image to gallery
        $file = $gallery->getBackend()->addImage(
            $product,
            $tmpDirectory . DS . $fileName,
            null,
            true
        );

        // Remove temporary directory
        $ioAdapter->rmdir($tmpDirectory, true);

        $gallery->getBackend()->updateImage($product, $file, $data);

        if (isset($data['types'])) {
            $gallery->getBackend()->setMediaAttribute($product, $data['types'], $file);
        }

        $product->save();
    } catch (Mage_Core_Exception $e) {
        $this->_fault('not_created', $e->getMessage());
    } catch (Exception $e) {
        $this->_fault('not_created', Mage::helper('catalog')->__('Cannot create image.'));
    }

    return $gallery->getBackend()->getRenamedImage($file);
}
...