Prestashop 1.7: Сохранение в БД изображений продуктов, но изображения не отображаются правильно в листе продуктов - PullRequest
1 голос
/ 23 января 2020

Я хочу получить изображения продуктов с существующего веб-сайта Prestashop 1.6 и импортировать их на новый веб-сайт Prestashop 1.7. Я сейчас говорю не о вариациях / комбинациях / склонениях продуктов, а только об оригинальных продуктах.

Итак, учитывая следующие переменные, я написал следующий код:

  • $ps16ProductObject - это продукт от Prestashop 1.6, полученный благодаря веб-сервисам Prestashop с использованием клиента Prestashop

  • $prestashop17Product (не отображается в моем коде для момент) - это продукт Prestashop 1.7, импортированный из Prestashop 1.6, который существует в Prestashop 1.7 (, то есть: он фактически создан и сохранен в БД). Я хочу импортировать $ps16ProductObject изображения в этот продукт Prestashop 1.7. $prestashop17Product - это экземпляр класса class/Product.php, гидратированный (->hydrate()) с продуктом Prestashop 1.6 $ps16ProductObject.

    if(array_key_exists('images', $ps16ProductObject['product']['associations'])) {
        foreach($ps16ProductObject['product']['associations']['images'] as $imagePs16Id) {
            $image = new \Image();
            $image->id_product = $ps16ProductObject['product']['id'];
            $image->position = \Image::getHighestPosition($ps16ProductObject['product']['id']) + 1;
            $image->add();
            $new_path = $image->getPathForCreation();                           
            $tmpfile = dirname( __FILE__ ) . '/../temp.jpeg';
            $ps16image = $this->ps16Client->get([
                'resource'      => 'images/products/' . $ps16ProductObject['product']['id'] . '/' . $imagePs16Id['id']
            ]); 
            file_put_contents($tmpfile, $ps16image);
            \ImageManager::resize($tmpfile, $new_path . '.jpeg');               
            unlink($tmpfile);
        }
    }
    

(по мотивам код /controllers/admin/AdminProductsController.php)

Изображения правильно сохранены в файловой системе и отображаются в таблицах БД image, image_lang, nch_image_shop.

Проблема это то, что: когда я go на лист продукта в BO веб-сайта PS17, он «показывает» изображения, но они пусты, как будто они не могут быть загружены. «Пустое» изображение продукта имеет следующий путь: /img/p/3/5/9/359-home_default.jpg и ошибки 404 нет. Я сравнил этот путь с путем к изображению листа, созданного вручную, и пришел к выводу, что этот путь абсолютно правильный.

Чего не хватает и как его исправить, пожалуйста?

Важно Изменить

На самом деле при попытке открыть /img/p/XXXX/YYYY/ZZZZ/XXXYYYYZZZ-home_default.jpg.

возникает ошибка 404.

1 Ответ

0 голосов
/ 23 января 2020

Следующий код работает. Важная новая часть, которая заставила скрипт работать:

            foreach ($imagesTypes as $imageType) {
                \ImageManager::resize($tmpfile, $new_path . '-' . stripslashes($imageType['name']) . '.' . 'jpg', $imageType['width'], $imageType['height'], 'jpg');
                if ($generate_hight_dpi_images) {
                    \ImageManager::resize($tmpfile, $new_path . '-' . stripslashes($imageType['name']) . '2x.' . 'jpg', (int) $imageType['width'] * 2, (int) $imageType['height'] * 2, 'jpg');
                }
            }

Полный код:

    if(array_key_exists('images', $ps16ProductObject['product']['associations'])) {
        foreach($ps16ProductObject['product']['associations']['images'] as $imagePs16Id) {
            $image = new \Image();
            $image->id_product = (int) $ps16ProductObject['product']['id'];
            $image->position = \Image::getHighestPosition($ps16ProductObject['product']['id']) + 1;             

            if (!\Image::getCover($image->id_product)) {
                $image->cover = 1;
            } else {
                $image->cover = 0;
            }

            $image->add();
            $new_path = $image->getPathForCreation();                           
            $tmpfile = dirname( __FILE__ ) . '/../temp.jpg';
            $ps16image = $this->ps16Client->get([
                'resource'      => 'images/products/' . $ps16ProductObject['product']['id'] . '/' . $imagePs16Id['id']
            ]); 
            file_put_contents($tmpfile, $ps16image);
            \ImageManager::resize($tmpfile, $new_path . '.' . 'jpg', null, null, 'jpg', false);

            $imagesTypes = \ImageType::getImagesTypes('products');
            $generate_hight_dpi_images = (bool) \Configuration::get('PS_HIGHT_DPI');

            foreach ($imagesTypes as $imageType) {
                \ImageManager::resize($tmpfile, $new_path . '-' . stripslashes($imageType['name']) . '.' . 'jpg', $imageType['width'], $imageType['height'], 'jpg');
                if ($generate_hight_dpi_images) {
                    \ImageManager::resize($tmpfile, $new_path . '-' . stripslashes($imageType['name']) . '2x.' . 'jpg', (int) $imageType['width'] * 2, (int) $imageType['height'] * 2, 'jpg');
                }
            }

            unlink($tmpfile);

        }
    }
...